BZOJ 2226: [Spoj 5971] LCMSum 莫比乌斯反演 + 严重卡常

Code:

#pragma GCC optimize(2)
#include
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 1000006 
#define M 1000004
#define ll long long  
using namespace std;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
char pbuf[100000],*pp=pbuf; 
int cnt,edges; 
bool vis[maxn]; 
int mu[maxn],prime[maxn],hd[maxn],to[maxn*15],nex[maxn*15];
ll sumv[maxn];         
int main()
{
	   // setIO("input"); 
	int i,j; 
	mu[1]=1; 
	for(i=1;i<=M;++i)  
		for(j=i;j<=M;j+=i) 
	    {
		    nex[++edges]=hd[j], hd[j]=edges,to[edges]=i;   
	    }
	sumv[1] = 1;
	for(i=2;i<=M;i++)
	{
		if(!vis[i]) prime[++cnt]=i,sumv[i] = 1-i;
		for(j=1;j<=cnt && i*prime[j] <= M;j ++ )
		{
			vis[i*prime[j]]=true;
			if(i%prime[j]==0) {sumv[i*prime[j]]=sumv[i]; break;}
			else sumv[i*prime[j]] = sumv[i] * sumv[prime[j]];
		}
	}
	int T=rd(),n;     
	ll re=0; 
	while(T--)
	{
	    n=rd(); 
	    re=0;
	    for(i=hd[n];i;i=nex[i]) re+=sumv[to[i]]*(n/to[i])*(n/to[i]+1)/2; 
	    re*=n;  
        printf("%lld\n",re); 
	}
	return 0; 
}

  

你可能感兴趣的:(BZOJ 2226: [Spoj 5971] LCMSum 莫比乌斯反演 + 严重卡常)