Advertisement
Guest User

codeshark problemA

a guest
Jun 30th, 2015
434
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6. #define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
  7. #define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
  8. #define rof(i,a,b) for(int (i)=(a);(i) > (b); --(i))
  9. #define rep(i, c) for(auto &(i) : (c))
  10. #define x first
  11. #define y second
  12. #define pb push_back
  13. #define PB pop_back()
  14. #define iOS ios_base::sync_with_stdio(false)
  15. #define sqr(a) (((a) * (a)))
  16. #define all(a) a.begin() , a.end()
  17. #define error(x) cerr << #x << " = " << (x) <<endl
  18. #define Error(a,b) cerr<<"( "<<#a<<" , "<<#b<<" ) = ( "<<(a)<<" , "<<(b)<<" )\n";
  19. #define errop(a) cerr<<#a<<" = ( "<<((a).x)<<" , "<<((a).y)<<" )\n";
  20. #define coud(a,b) cout<<fixed << setprecision((b)) << (a)
  21. #define L(x) ((x)<<1)
  22. #define R(x) (((x)<<1)+1)
  23. #define umap unordered_map
  24. #define double long double
  25. typedef long long ll;
  26. #define int ll
  27. typedef pair<int,int>pii;
  28. typedef vector<int> vi;
  29. typedef complex<double> point;
  30. template <typename T> using os =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31. template <class T>  inline void smax(T &x,T y){ x = max((x), (y));}
  32. template <class T>  inline void smin(T &x,T y){ x = min((x), (y));}
  33. const int maxn = 1975296 + 100;
  34. bool prime[maxn];
  35. int phi[maxn], lambda[maxn];
  36. vi v[maxn];
  37. int mark[maxn];
  38. int mod;
  39. inline int power(int a, int b,int n){
  40.     if(!b)  return 1;
  41.     int c = power(a, b/2, n);
  42.     c = (1LL * c * c)%n;
  43.     if(b % 2)
  44.         c = (1LL * c * a)%n;
  45.     return c;
  46. }
  47. inline int solve(int n){
  48.     ll ans = 0LL;
  49.     memset(mark,0,sizeof mark);
  50.     vi v;
  51.     int m = lambda[n];
  52.     for(int i = 1;i * i <= m;i ++)if(m % i == 0){
  53.         v.pb(i);
  54.         if((m/i) > i)
  55.             v.pb(m/i);
  56.     }
  57.     sort(all(v));
  58.     For(p,1,n){
  59.         if(__gcd(p, n) == 1){
  60.             rep(c, v)
  61.                 if(power(p, c, n) == 1){
  62.                     ans = (ans + c);
  63.                     break;
  64.                 }
  65.         }
  66.         else{
  67.             int cur = p;
  68.             while(cur && mark[cur] != p){
  69.                 mark[cur] = p;
  70.                 ans = (ans + 1LL);
  71.                 cur = (1LL * cur * p)%n;
  72.             }
  73.         }
  74.     }
  75.     return ans;
  76. }
  77. int sum[maxn];
  78. main(){
  79.     cin >> mod; //  reading your delta
  80.     fill(prime+2,prime+maxn,true);
  81.     For(i,1,maxn){
  82.         phi[i] += i;
  83.         if(prime[i])
  84.                 v[i].pb(i);
  85.         for(int j = i + i;j < maxn;j += i){
  86.             phi[j] -= phi[i];
  87.             if(prime[i])
  88.                 prime[j] = false, v[j].pb(i);
  89.         }
  90.     }
  91.     For(i,2,maxn){
  92.         lambda[i] = 1;
  93.         int k;
  94.         if(v[i].size() == 1){
  95.             if(v[i][0] == 2){
  96.                 if(i == 2 or i == 4)
  97.                     lambda[i] = phi[i];
  98.                 else
  99.                     lambda[i] = phi[i]/2;
  100.             }
  101.             else
  102.                 lambda[i] = phi[i];
  103.         }
  104.         else{
  105.             int j = i;
  106.             rep(p, v[i]){
  107.                 int x = 1;
  108.                 while(j % p == 0){
  109.                     j /= p;
  110.                     x *= p;
  111.                 }
  112.                 x = lambda[x];
  113.                 k = __gcd(x, lambda[i]);
  114.                 x/=k;
  115.                 lambda[i] *= x;
  116.  
  117.             }
  118.         }
  119.     }
  120.     For(i,0,maxn){
  121.         int x = (1LL * lambda[i] * lambda[i]);
  122.         sum[i] =(1LL * sum[i-1] + x);
  123.     }
  124.     cout << solve(1234) % mod << '\n' <<
  125.     solve(1111151) % mod << '\n' <<
  126.     solve(1234567) % mod << '\n' <<
  127.     sum[1234] % mod << '\n' <<
  128.     sum[12345] % mod<< '\n'<<
  129.     sum[1234567] % mod<< endl;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement