Advertisement
Kaidul

12619(WA)

Apr 21st, 2013
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <map>
  4. #include <vector>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long i64;
  8. /** function **/
  9. #define SDi(x) sf("%d",&x)
  10. #define rep(i,n) for(__typeof(n) i=0; i<(n); i++)
  11. #define pf printf
  12. #define sf scanf
  13. #define pb push_back
  14. #define READ(f) freopen(f, "r", stdin)
  15.  
  16. #define Max 1000000
  17. #define Mod 1000000007
  18.  
  19. i64 status[(Max/32) + 10];
  20. vector <i64> primeList;
  21. map <i64, i64> primeFactor;
  22.  
  23. bool Check(i64 N, i64 pos) {
  24.     return (bool)(N & (1<<pos));
  25. }
  26. int Set(i64 N, i64 pos) {
  27.     return N=N | (1<<pos);
  28. }
  29.  
  30. void RSieve(i64 N) {
  31.     primeList.clear();
  32.     i64 i, j, sqrtN;
  33.     sqrtN = i64( sqrt( N ) );
  34.     for( i = 3; i <= sqrtN; i += 2 ) {
  35.         if( Check(status[i>>5],i&31)==0) {
  36.             for( j = i*i; j <= N; j += (i<<1) ) {
  37.                 status[j>>5]=Set(status[j>>5],j & 31)   ;
  38.             }
  39.         }
  40.     }
  41.     primeList.pb(2);
  42.     for(i=3; i<=N; i+=2)
  43.         if( !Check(status[i>>5], i&31)) primeList.pb(i);
  44. }
  45.  
  46. i64 d(int n, bool code) {
  47.     if(code) {
  48.         rep(i, primeList.size()) {
  49.             int p = primeList[i];
  50.             if(p > n) break;
  51.             while(n % p == 0) {
  52.                 n = n / p;
  53.                 primeFactor[p] += 1;
  54.             }
  55.         }
  56.     } else {
  57.         rep(i, primeList.size()) {
  58.             int p = primeList[i];
  59.             if(p > n) break;
  60.             while(n % p == 0) {
  61.                 n = n / p;
  62.                 primeFactor[p] -= 1;
  63.             }
  64.         }
  65.     }
  66.     i64 result = 1;
  67.     rep(i, primeFactor.size()) {
  68.         i64 r = primeFactor[i];
  69.         result = result % Mod * (r + 1) % Mod;
  70.     }
  71.     return result;
  72. }
  73.  
  74.  
  75. int main() {
  76.     READ("in.txt");
  77.     RSieve(Max);
  78.     int tcase, caseNo = 1;
  79.     int factor, result, n;
  80.     SDi(tcase);
  81.     while(tcase--) {
  82.         primeFactor.clear(), result = 0;
  83.         SDi(n);
  84.         rep(i, n) {
  85.             SDi(factor);
  86.             if(factor < 0) result += d(abs(factor), 0) % Mod;
  87.             else result += d(factor, 1) % Mod;
  88.         }
  89.         pf("Case %d: %d\n", caseNo, result % Mod);
  90.         caseNo++;
  91.     }
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement