zoukankan      html  css  js  c++  java
  • [BZOJ 4916]神犇和蒟蒻

    传送门

    Description

    [G(n)=sum_{i=1}^n mu(i^2) \ F(n)=sum_{i=1}^n phi(i^2) ]

    (sum_G)(sum_F)

    Solution 

    • For all cases,(G(n)=n)

      Because (G(i^2)=[i==1])

    • [egin{equation} egin{split} F(n)&=sum_{i=1}^n phi(i^2)\ &=sum_{i=1}^{n} icdot phi(i)\ end{split} end{equation}\ ]

    • [egin{equation} egin{split} &sum_{i=1}^nsum_{d|i}d cdot phi(d)cdotfrac{i}{d}\=&sum_{i=1}^nicdot sum_{d|i} phi(d)\ =&sum_{i=1}^ni^2 \=&frac{n(n+1)(2n+1)}{6} end{split} end{equation} ]

    • [sum_{i=1}^n(Id*F)(i)=frac{n(n+1)(2n+1)}{6} ]

    • [egin{equation} egin{split} Sum_F(n)=&sum_{i=1}^n(Id*F)(i)-sum_{i=2}^{n}icdot F(lfloorfrac{n}{i} floor)\ =&frac{n(n+1)(2n+1)}{6}-sum_{i=2}^{n}icdot F(lfloorfrac{n}{i} floor) end{split} end{equation} ]


    Code 

    #include<bits/stdc++.h>
    #define reg register
    using namespace std;
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    	return x*f;
    }
    const int MN=1e9,MX=1e6+5,M=1e6,mod=1e9+7,inv6=166666668,inv2=500000004;
    int N,F[MX],phi[MX];
    int Mul(int x,int y){return 1ll*x*y%mod;}
    int Add(int x,int y){return (x+y)%mod;}
    void init()
    {
    	static int prime[MX],tot;
    	static bool mark[MX];
    	reg int i,j;
    	phi[1]=1;
    	for(i=2;i<=M;++i)
    	{
    		if(!mark[i]){prime[++tot]=i;phi[i]=i-1;}
    		for(j=1;j<=tot&&i*prime[j]<=M;++j)
    		{
    			mark[i*prime[j]]=true;
    			if(i%prime[j]==0){phi[i*prime[j]]=Mul(phi[i],prime[j]);break;}
    			else phi[i*prime[j]]=Mul(phi[i],phi[prime[j]]);
    		}
    	}
    	for(i=1;i<=M;++i) phi[i]=Add(Mul(phi[i],i),phi[i-1]);
    }
    int S(int x){return Mul(x,Mul(x+1,inv2));}
    int calc(int n)
    {
    	if(n<=M) return phi[n];
    	if(F[N/n]) return F[N/n];
    	int res=Mul(Mul((n+1),Mul((2*n+1),n)),inv6);
    	for(int l=2,r;l<=n;l=r+1)
    	{
    		r=n/(n/l);
    		res=Add(res,mod-Mul(Add(S(r),mod-S(l-1)),calc(n/l)));
    	}
    	return F[N/n]=res;
    }
    
    int main()
    {
    	N=read();
    	puts("1");init();
    	printf("%lld
    ",calc(N));
    	return 0;
    }
    


    Blog来自PaperCloud,未经允许,请勿转载,TKS!

  • 相关阅读:
    NFS服务
    DNS服务
    git使用笔记(七)版本回退和撤销
    git使用笔记(六)github
    git使用笔记(五)打标签
    git使用笔记(四)远程操作
    git使用笔记(三)文件忽略
    git使用笔记(二)分支与合并
    git使用笔记(一)入门
    GDB使用小记
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/bzoj_4916.html
Copyright © 2011-2022 走看看