Advertisement
yicongli

T151T2

Mar 14th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=2e6+7;
  17.  
  18. int tot;
  19. int pri[N];
  20. bool mark[N];
  21.  
  22. inline void pre(int n){
  23.     for(int i=2;i<=n;++i){
  24.         if(!mark[i])pri[++tot]=i;
  25.         for(int j=1;j<=tot;++j){
  26.             int tmp=i*pri[j];
  27.             if(tmp>n)break;
  28.             mark[tmp]=1;
  29.             if(i%pri[j]==0)break;
  30.         }
  31.     }
  32. }
  33.  
  34. inline int qpow(ll a,int b,int p){
  35.     ll ans=1;
  36.     while(b){
  37.         if(b&1)(ans*=a)%=p;
  38.         (a*=a)%=p;
  39.         b>>=1;
  40.     }
  41.     return ans;
  42. }
  43.  
  44. inline int get(int p){
  45.     for(int i=2;i<p;++i){
  46.         if(qpow(i,(p-1)/2,p)==p-1){
  47.             return qpow(i,(p-1)/4,p);
  48.         }
  49.     }
  50. }
  51.  
  52. bool vis[N];
  53. ll f[N];
  54.  
  55. int main(){
  56.     freopen("rauchen.in","r",stdin);
  57.     freopen("rauchen.out","w",stdout);
  58.     int n;r(n);
  59.     pre(2*n);
  60.     ll ans=0;
  61.     for(int i=0;i<=n;++i){
  62.         f[i]=(ll)4*i*i+1;
  63.     }
  64.     for(int i=2;i<=tot;++i){
  65.         int p=pri[i];
  66.         if(p%4!=1)continue;
  67.         int rt=get(p);
  68.         assert((ll)rt*rt%p==p-1);
  69.         for(int k=(ll)(p+1)/2*rt%p;k<=n;k+=p){
  70.             while(f[k]>p&&f[k]%p==0)f[k]/=p;
  71.             if(f[k]==p){
  72.                 ans+=p;
  73.                 f[k]=1;
  74.             }
  75.         }
  76.         rt=p-rt;
  77.         for(int k=(ll)(p+1)/2*rt%p;k<=n;k+=p){
  78.             while(f[k]>p&&f[k]%p==0)f[k]/=p;
  79.             if(f[k]==p){
  80.                 ans+=p;
  81.                 f[k]=1;
  82.             }
  83.            
  84.         }
  85.     }
  86.     for(int i=1;i<=n;++i){
  87.         if(f[i]!=1)ans+=f[i];
  88.     }
  89.     printf("%lld\n",ans);
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement