zoukankan      html  css  js  c++  java
  • 【BZOJ4407】于神之怒加强版(莫比乌斯反演)

    【BZOJ4407】于神之怒加强版(莫比乌斯反演)

    题面

    BZOJ
    求:

    [sum_{i=1}^nsum_{j=1}^mgcd(i,j)^k ]

    题解

    根据惯用套路
    把公约数提出来

    [sum_{d=1}^nd^ksum_{i=1}^nsum_{j=1}^m[gcd(i,j)==d] ]

    再提一次

    [sum_{d=1}^nd^ksum_{i=1}^{n/d}sum_{j=1}^{m/d}[gcd(i,j)==1] ]

    后面这个东西很显然可以数论分块+莫比乌斯反演做到(O(sqrt n))
    前面枚举的(d)也可以数论分块,于是我们可以做到复杂度(O(n))
    但是有多组询问,这样的复杂度还不够

    把后面的式子直接换成莫比乌斯反演推出来的式子

    [sum_{d=1}^nd^ksum_{i=1}^{n/d}mu(i)[frac{n/d}{i}][frac{m/d}{i}] ]

    (d)除在上面太丑了

    [sum_{d=1}^nd^ksum_{i=1}^{n/d}mu(i)[frac{n}{id}][frac{m}{id}] ]

    (T=id)

    [sum_{d=1}^nd^ksum_{i=1}^{n/d}mu(i)[frac{n}{T}][frac{m}{T}] ]

    (T)给拎出来

    [sum_{T=1}^n[frac{n}{T}][frac{m}{T}]sum_{d|T}d^kmu(frac{T}{d}) ]

    后面这玩意是一个积性函数,可以线性筛出来
    前面的东西可以数论分块
    所以,最后总的复杂度就是(O(sqrt n))

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define MOD 1000000007
    #define MAX 5000000
    inline int read()
    {
    	int x=0,t=1;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=-1,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return x*t;
    }
    int fpow(int a,int b)
    {
    	int s=1;
    	while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}
    	return s;
    }
    int n,m,K;
    int pri[MAX],tot;
    int sum[MAX+1000],s[MAX];
    bool zs[MAX+1000];
    void pre()
    {
    	zs[1]=true;sum[1]=1;
    	for(int i=2;i<=MAX;++i)
    	{
    		if(!zs[i])pri[++tot]=i,s[tot]=fpow(i,K),sum[i]=s[tot]-1;
    		for(int j=1;j<=tot&&i*pri[j]<=MAX;++j)
    		{
    			zs[i*pri[j]]=true;
    			if(i%pri[j]==0){sum[i*pri[j]]=1ll*sum[i]*s[j]%MOD;break;}
    			else sum[i*pri[j]]=1ll*sum[i]*sum[pri[j]]%MOD;
    		}
    	}
    	for(int i=1;i<=MAX;++i)sum[i]=(sum[i]+sum[i-1])%MOD;
    }
    int main()
    {
    	int T=read();K=read();
    	pre();
    	while(T--)
    	{
    		n=read();m=read();if(n>m)swap(n,m);
    		int i=1,j;
    		long long ans=0;
    		while(i<=n)
    		{
    			j=min(n/(n/i),m/(m/i));
    			ans+=1ll*(n/i)*(m/i)%MOD*(sum[j]-sum[i-1])%MOD;
    			ans%=MOD;
    			i=j+1;
    		}
    		printf("%lld
    ",(ans+MOD)%MOD);
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/cjyyb/p/8266725.html
Copyright © 2011-2022 走看看