bzoj3944: Sum

来源:互联网 发布:上海萌动网络 编辑:程序博客网 时间:2024/06/07 15:55

挖坑不填。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define ll long longusing namespace std;int read(){    char ch=getchar();int f=0;    while(ch<'0'||ch>'9')ch=getchar();    while(ch>='0'&&ch<='9'){f=(f<<1)+(f<<3)+ch-'0';ch=getchar();}    return f;}ll phi[2000005],mu[2000005],p[100005],q[100005];bool vis[100005];int cas,n,m,cnt,c[1000005];ll get_p(int x){    return x<=m?phi[x]:p[n/x];}ll get_q(int x){    return x<=m?mu[x]:q[n/x];}void solve(int x){    if(x<=m) return;    int i,j=1,t=n/x;    if(vis[t]) return ;vis[t]=1;    p[t]=((ll)x+1)*x>>1;q[t]=1;    while(j<x)    {        i=j+1;j=x/(x/i);solve(x/i);        p[t]-=get_p(x/i)*(j-i+1);q[t]-=get_q(x/i)*(j-i+1);    }}int main(){    cas=read();m=2000000;    phi[1]=mu[1]=1;    for(int i=2;i<=m;i++)    {        if(!phi[i])        {            phi[i]=i-1;mu[i]=-1;c[++cnt]=i;        }        for(int j=1;j<=cnt;j++)        {            if(i*c[j]>m)            break;            if(i%c[j])            {                phi[i*c[j]]=phi[i]*(c[j]-1);                mu[i*c[j]]=-mu[i];            }            else            {                phi[i*c[j]]=phi[i]*c[j];                mu[i*c[j]]=0;                break;            }        }    }    for(int i=2;i<=m;i++)    {        phi[i]+=phi[i-1];        mu[i]+=mu[i-1];    }    while(cas--)    {        n=read();        memset(vis,0,sizeof(vis));        if(n<=m)        printf("%lld %lld\n",phi[n],mu[n]);        else        {            solve((ll)n);            printf("%lld %lld\n",p[1],q[1]);        }    }}
原创粉丝点击