題目大意:給定
同BZOJ3944
這麼喜歡炒冷飯?
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1501000
using namespace std;
int limit=1500000;
int n;
int prime[M],tot;
bool not_prime[M];
long long phi[M];
void Linear_Shaker()
{
phi[1]=1;
for(int i=2;i<=limit;i++)
{
if(!not_prime[i])
{
prime[++tot]=i;
phi[i]=i-1;
}
for(int j=1;i*prime[j]<=limit;j++)
{
not_prime[i*prime[j]]=true;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for(int i=1;i<=limit;i++)
phi[i]+=phi[i-1];
}
long long G(int n)
{
return (long long)n*(n+1)>>1;
}
int main()
{
cin>>n;
if(n<=limit)
{
limit=n;
Linear_Shaker();
return cout<<phi[n]<<endl,0;
}
Linear_Shaker();
static long long F[M];
//F[n/i]
int i,k;
for(k=1;n/k>limit;k++);
for(k--;k;k--)
{
F[k]=G(n/k);
for(i=k<<1;n/i>limit;i+=k)
F[k]-=F[i];
int m=n/k,last;
for(i/=k;i<=m;i=last+1)
{
last=m/(m/i);
F[k]-=(long long)(last-i+1)*phi[m/i];
}
}
cout<<F[1]<<endl;
return 0;
}