Codeforces Round #450 (Div. 2) ( D. Unusual Sequences 莫比乌斯反演)

题目链接

好久没遇到莫比乌斯反演的题了,今天打cf遇到了  居然没写出来。特地来补补

D. Unusual Sequences

题意:

Codeforces Round #450 (Div. 2) ( D. Unusual Sequences 莫比乌斯反演)_第1张图片

做法参考来自:博客

Codeforces Round #450 (Div. 2) ( D. Unusual Sequences 莫比乌斯反演)_第2张图片

1、首先隔板法那里解析:

将y  为  y个1  然后就是 简单的隔板法。

最后

Codeforces Round #450 (Div. 2) ( D. Unusual Sequences 莫比乌斯反演)_第3张图片

然后有个地方一直没懂为什么是相等的:

g(i)=\sum _{d|i}f(d)

现在来分析分析,g(i)里面有很多gcd不同的   假设i为6  那么  g(i)中gcd有四种:1,2,3,6 

当为2、3、6 时,将所有的数除上2、3、6 不就变成了,gcd为1了,然后总和 也为 i/gcd  。。证毕

#include
#include
using namespace std;
const int mod=1e9+7;
const int N=1e5+7;
int x,y,tot;
int d[N];
int qread()
{
	int x=0;
	char ch=getchar();
	while(ch<'0' || ch>'9')ch=getchar();
	while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x;
}
int GetMu(int x)
{
	if(x==1)return 1;
	int t=0,sqr=sqrt(x);
	for(int i=2;i<=sqr;i++)
		if(x%i==0)
		{
			t++;x/=i;
			if(x%i==0)return 0;
		}
	if(x>1)t++;
	return t&1?-1:1;
}
int Fpow(long long b,int p)
{
	long long res=1;
	for(;p;p>>=1,b=b*b%mod)
		if(p&1)res=res*b%mod;
	return res;
}
int main()
{
	scanf("%d%d",&x,&y);
	if(y%x){printf("0\n");return 0;}
	y/=x;
	for(int i=1;i*i<=y;i++)
		if(y%i==0)
		{
			d[++tot]=i;
			if(i*i!=y)d[++tot]=y/i;
		}
	long long ans=0;
	for(int i=1;i<=tot;i++)
		ans+=GetMu(y/d[i])*Fpow(2,d[i]-1);
	printf("%d\n",(ans%mod+mod)%mod);
	return 0;
}

 

你可能感兴趣的:(数论---莫比乌斯反演)