Friday, 28 July 2017

Lightoj 1278 - Sum of Consecutive Integers

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MAX 10010896
  4. #define LMT 3164
  5. #define ll long long unsigned
  6.  
  7. int flag[MAX >> 6], primes[800000], total;
  8.  
  9. #define ifc(x) (flag[x>>6]&(1<<((x>>1)&31)))
  10. #define isc(x) (flag[x>>6]|=(1<<((x>>1)&31)))
  11.  
  12. void sieve() {
  13.     int i, j, k;
  14.     for(= 3; i < LMT; i+=2) if(!ifc(i)) for(j=i*i, k=i<<1; j < MAX; j+=k) isc(j);
  15.     primes[0] = 2, total = 1;
  16.     for(= 3; i < MAX; i+=2) if(!ifc(i)) primes[total++] = i;
  17.     //for(int i = 0; i <100000; i++) cout<<primes[i]<<" ";
  18. }
  19.  
  20.  
  21. ll answer(ll n){
  22.     while(n%2 == 0) n = n/2;
  23.     ll ans = 1;
  24.     for(int i = 0;primes[i]<= sqrt(n) && n!= 1; i++){
  25.         ll c = 0;
  26.         while(n%primes[i] == 0){
  27.             n = n/primes[i];
  28.             c++;
  29.         }
  30.         ans*= (c+1);
  31.     }
  32.     if(n!= 1) ans*=2;
  33.     return ans;
  34. }
  35.  
  36. int main(){
  37.     int test, cs;
  38.     sieve();
  39.     scanf("%d"&test);
  40.     for(cs = 1; cs <= test; cs++) {
  41.         ll n;
  42.         scanf("%llu"&n);
  43.         printf("Case %d: %llu\n", cs, answer(n)-1);
  44.     }
  45.     return 0;
  46. }
  47. /*
  48. int ndiv(i64 n) {
  49.     int rt, i, cnt, ret;
  50.     printf("Now n = %lld\n", n);
  51.     while(n > 0 && (n & 1)==0) n >>= 1;
  52.     rt = (int)sqrt((double)n);
  53.     printf("but Now n = %lld\n", n);
  54.     for(i = ret = 1; primes[i] <= rt; i++) {
  55.         if(n % primes[i] == 0) {
  56.             n /= primes[i], cnt = 1;
  57.             while(n % primes[i] == 0) {
  58.                 n /= primes[i];
  59.                 cnt++;
  60.             }
  61.             ret *= (cnt + 1);
  62.             rt = (int)sqrt((double)n);
  63.         }
  64.     }
  65.     if(n > 1) ret <<= 1;
  66.     return ret;
  67. }
  68.  
  69. int main() {
  70.     int test, cs;
  71.     i64 n;
  72.     sieve();
  73.     scanf("%d", &test);
  74.     for(cs = 1; cs <= test; cs++) {
  75.         scanf("%lld", &n);
  76.         printf("Case %d: %d\n", cs, ndiv(n)-1);
  77.     }
  78.     return 0;
  79. }
  80.  
  81.  
  82. */

No comments:

Post a Comment

Most Featured Post

Lightoj 1159 - Batman

http://lightoj.com/volume_showproblem.php?problem=1159 problem analysis: First i thought of this as if s1, s2 and s3 are those three str...