Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=2e6+7;
- int tot;
- int pri[N];
- bool mark[N];
- inline void pre(int n){
- for(int i=2;i<=n;++i){
- if(!mark[i])pri[++tot]=i;
- for(int j=1;j<=tot;++j){
- int tmp=i*pri[j];
- if(tmp>n)break;
- mark[tmp]=1;
- if(i%pri[j]==0)break;
- }
- }
- }
- inline int qpow(ll a,int b,int p){
- ll ans=1;
- while(b){
- if(b&1)(ans*=a)%=p;
- (a*=a)%=p;
- b>>=1;
- }
- return ans;
- }
- inline int get(int p){
- for(int i=2;i<p;++i){
- if(qpow(i,(p-1)/2,p)==p-1){
- return qpow(i,(p-1)/4,p);
- }
- }
- }
- bool vis[N];
- ll f[N];
- int main(){
- freopen("rauchen.in","r",stdin);
- freopen("rauchen.out","w",stdout);
- int n;r(n);
- pre(2*n);
- ll ans=0;
- for(int i=0;i<=n;++i){
- f[i]=(ll)4*i*i+1;
- }
- for(int i=2;i<=tot;++i){
- int p=pri[i];
- if(p%4!=1)continue;
- int rt=get(p);
- assert((ll)rt*rt%p==p-1);
- for(int k=(ll)(p+1)/2*rt%p;k<=n;k+=p){
- while(f[k]>p&&f[k]%p==0)f[k]/=p;
- if(f[k]==p){
- ans+=p;
- f[k]=1;
- }
- }
- rt=p-rt;
- for(int k=(ll)(p+1)/2*rt%p;k<=n;k+=p){
- while(f[k]>p&&f[k]%p==0)f[k]/=p;
- if(f[k]==p){
- ans+=p;
- f[k]=1;
- }
- }
- }
- for(int i=1;i<=n;++i){
- if(f[i]!=1)ans+=f[i];
- }
- printf("%lld\n",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement