• bzoj2693 jzptab


    题意

    承接这题
    (sumlimits_{d=1}^{n}d*sumlimits_{x=1}^{frac{n}{d}}x^2*mu(x)(sumlimits_{i=1}^{frac{n}{d*x}}i)(sumlimits_{j=1}^{frac{m}{d*x}}j))
    (T=d*x)(sum(x)=sumlimits_{i=1}^{n}i)
    (sumlimits_{T=1}^{n}sum(frac{n}{T})*sum(frac{m}{T})sumlimits_{d|T}d*frac{T^2}{d^2}mu(frac{T}{d}))
    (sumlimits_{T=1}^{n}sum(frac{n}{T})*sum(frac{m}{T})T*sumlimits_{d|T}frac{T}{d}mu(frac{T}{d}))
    (sumlimits_{T=1}^{n}sum(frac{n}{T})*sum(frac{m}{T})T*sumlimits_{d|T}dmu(d))
    考虑如何求(f(T)=sumlimits_{d|T}dmu(d))
    这是个积性函数:
    证明:
    显然有(f(p^k)=1-p)
    (n=p_1^{c_1}*p_2^{c_2}*...*p_k^{c_k})
    考虑求出了(f(p_1^{c_1}*p_2^{c_2}*...*p_{k-1}^{c_{k-1}})),现在加入(p_k^{c_k}),考虑加上(2)个以上(p_k)的约数的(mu())(0),不考虑,加上(0)个的约数和原来相同,加上(1)个的约数(mu)会变号,因此:
    (f(n)=f(p_1^{c_1}*p_2^{c_2}*...*p_{k-1}^{c_{k-1}})*1-f(p_1^{c_1}*p_2^{c_2}*...*p_{k-1}^{c_{k-1}})*p=f(p_1^{c_1}*p_2^{c_2}*...*p_{k-1}^{c_{k-1}})*f(p_k^{c_k}))
    于是可以线性筛求出,询问只需除法分块即可。

    注意模数是(10^8+9)!!!!!!!!!!!!!!

    code:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=10000010;
    const ll mod=1e8+9;
    int T,n,m;
    ll f[maxn],sum[maxn],s[maxn];
    bool vis[maxn];
    vector<int>prime;
    inline void pre_work(int n)
    {
    	vis[1]=1;f[1]=1;
    	for(int i=2;i<=n;i++)
    	{
    		if(!vis[i])prime.push_back(i),f[i]=(mod+1-i)%mod;
    		for(unsigned int j=0;j<prime.size()&&i*prime[j]<=n;j++)
    		{
    			vis[i*prime[j]]=1;
    			if(i%prime[j]==0){f[i*prime[j]]=f[i];break;}
    			f[i*prime[j]]=f[i]*f[prime[j]]%mod;
    		}
    	}
    	for(int i=1;i<=n;i++)sum[i]=(sum[i-1]+1ll*i*f[i]%mod)%mod;
    	for(int i=1;i<=n;i++)s[i]=(s[i-1]+i)%mod;
    }
    inline ll solve(int n,int m)
    {
    	ll res=0;
    	if(n>m)swap(n,m);
    	for(int l=1,r;l<=n;l=r+1)
    	{
    		r=min(n/(n/l),m/(m/l));
    		res=(res+s[n/l]*s[m/l]%mod*((sum[r]-sum[l-1])%mod+mod)%mod)%mod;
    	}
    	return res;
    }
    int main()
    {
    	pre_work(10000000);
    	scanf("%d",&T);
    	while(T--)
    	{
    		scanf("%d%d",&n,&m);
    		printf("%lld
    ",solve(n,m));
    	}
    	return 0;
    }
    
  • 相关阅读:
    vim 的配置文件
    linux bash 的自动补全
    linux ping 命令
    linux 安装ifconfig
    dos exist 命令
    linux 用户的添加,组的添加,以及查看
    if else 的.bat 文件
    For 的.bat文件
    rmdir 的.bat文件
    dos set 命令
  • 原文地址:https://www.cnblogs.com/nofind/p/11951440.html
Copyright © 2020-2023  润新知