• 【Luogu5348】密码解锁(莫比乌斯反演,数论)


    【Luogu5348】密码解锁(莫比乌斯反演,数论)

    题面

    洛谷

    题解

    首先题目给定的限制是(sum_{n|i}a[i]=mu(n)),然后把这个东西反演一下,
    莫比乌斯反演的式子是:(g(n)=sum_{n|i}f(i) ightarrow f(n)=sum_{n|i}g(i)mu(frac{i}{n})),在这里(mu)就是(g),而(a)就是(f)
    所以我们可以得到:(a[m]=sum_{m|i}mu(i)mu(frac{i}{m})=sum_{i=1}^{n/m}mu(i)mu(im))
    然后直接把后面拆开,得到:(mu(m)sum_{i=1}^{n/m}[gcd(i,m)=1]mu(i)^2)
    后面那一半接着拆,可以得到:

    [egin{aligned} a[m]&=mu(m)sum_{i=1}^{n/m}mu(i)^2sum_{j|i,j|m}mu(j)\ &=mu(m)sum_{j|m}mu(j)sum_{j|i}^{n/m}mu(i)^2 end{aligned}]

    前面的(j)显然只有(sqrt m) 个了。
    后面一半枚举最小的平方因子,然后把这部分的贡献减去就行了,这部分的复杂度是(O(sqrt frac{n}{m}))
    所以总的复杂度就是(O(sigma_0(m)sqrt{frac{n}{m}}))

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define ll long long
    inline ll read()
    {
    	ll x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    ll n,ans;int m,fac[100],p;;
    const int N=1e6;
    bool zs[N];
    int mu[N],pri[N],tot;
    void Sieve()
    {
    	mu[1]=1;
    	for(int i=2;i<N;++i)
    	{
    		if(!zs[i])pri[++tot]=i,mu[i]=-1;
    		for(int j=1;j<=tot&&i*pri[j]<N;++j)
    		{
    			zs[i*pri[j]]=true;
    			if(i%pri[j]==0)break;
    			mu[i*pri[j]]=-mu[i];
    		}
    	}
    }
    void Calc(int j,int v)
    {
    	int nn=n/m/j,ret=0;
    	for(int i=1;i*i<=nn*j;++i)
    	{
    		int ii=i*i/__gcd(i*i,j);
    		ret+=nn/ii*mu[i];
    	}
    	ans+=v*ret;
    }
    void dfs(int x,int j,int mu)
    {
    	if(x==p+1){Calc(j,mu);return;}
    	dfs(x+1,j,mu);
    	dfs(x+1,j*fac[x],-mu);
    }
    int main()
    {
    	int T=read();Sieve();
    	while(T--)
    	{
    		n=read();m=read();p=ans=0;
    		int x=m;bool fl=false;
    		for(int i=2;i*i<=x;++i)
    			if(x%i==0)
    			{
    				int c=0;fac[++p]=i;
    				while(x%i==0)++c,x/=i;
    				if(c>1){fl=true;break;}
    			}
    		if(fl){puts("0");continue;}
    		if(x>1)fac[++p]=x;
    		dfs(1,1,1);
    		printf("%lld
    ",ans*((p&1)?-1:1));
    	}
    }
    
  • 相关阅读:
    npm ERR! shasum check failed for
    使用js闭包封装一个原生的模态框
    使用weexplus + vue开发APP的填坑之旅
    weex 中出现 loading无法关闭
    weex create test-app Error: Cannot find module '../package.json'
    flutter 填坑之旅(dart学习笔记篇)
    各种版本的Linux 镜像下载网址
    在vue 项目中嵌入jsp页面
    mahout 推荐引擎的相关介绍,理解,如何应用。(2)
    mahout 推荐引擎的相关介绍,理解,如何应用。(1)
  • 原文地址:https://www.cnblogs.com/cjyyb/p/10823746.html
Copyright © 2020-2023  润新知