Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define CHOR 1000001
- #define pb push_back
- using namespace::std;
- typedef long long ll;
- int lo[CHOR], mu[CHOR], phi[CHOR];
- ll f[CHOR];
- int zex[10000];
- ll ans[CHOR];
- bool vis[CHOR];
- void phi_calc(void)
- {
- for(int i=1;i<CHOR;i++)
- {
- lo[i] = i;
- mu[i] = 1;
- }
- for(int i=2;i*i<CHOR;i++)
- {
- if(lo[i] == i)
- {
- for(int j=i*i;j<CHOR;j+=i)
- {
- if(lo[j] == j) lo[j] = i;
- }
- }
- }
- //std::cout<<lo[18]<<"\n";
- for(int i=2;i<CHOR;i++)
- {
- int j = i;
- while(lo[j/lo[j]] != lo[j]){
- j /= lo[j];
- }
- //std::cout<<i<<" "<<j<<"\n";
- if(j != 1)
- mu[i] = 0;
- else mu[i] = -mu[i/lo[i]];
- //std::cout<<mu[i]<<"\n";
- }
- for(int i=1;i<CHOR;i++)
- {
- for(int j=i;j<CHOR;j+=i)
- phi[j] += (j/i)*mu[i];
- }
- for(int i=1;i<CHOR;i++)
- f[i] = f[i-1] + phi[i];
- return;
- }
- int main(void)
- {
- phi_calc();
- int n;
- scanf("%d",&n);
- int len;
- while(n)
- {
- ll G = 0;
- if(vis[n]){
- printf("%lld\n",ans[n]);
- scanf("%d",&n);
- continue;
- }
- /*
- len = 0;
- for(int i=1,lx=0;i<=n;i=lx+1)
- {
- zex[len++]= i;
- lx = n/(n/i);
- }
- for(int i=0;i<len;i++)
- {
- if(i != len-1)
- G += (1LL*(n/zex[i])*(n/zex[i] - 1)/2)*(f[zex[i+1]-1] - f[zex[i]-1]);
- else G +=(1LL*(n/zex[i])*(n/zex[i] - 1)/2)*(f[n] - f[zex[i]-1]);
- }
- */
- int last = 1;
- int lx = n/(n/1);
- for(int i=lx+1;i<=n;i=lx+1)
- {
- G += (1LL*(n/last)*(n/last - 1)/2)*(f[i-1] - f[last-1]);
- lx = n/(n/i);
- last = i;
- }
- G += (1LL*(n/last)*(n/last - 1)/2)*(f[n] - f[last-1]);
- vis[n] = true;
- ans[n] = G;
- printf("%lld\n",G);
- scanf("%d",&n);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement