HDU4466 Triangle 计数 容斥原理

原文链接

题目传送门 - HDU4466

题意

题解

代码

#include <bits/stdc++.h>
using namespace std;
const int N=5e6+5,mod=1e9+7;
int Case=0,n,f[N],Pow[N];
int main(){
	Pow[0]=1;
	for (int i=1;i<N;i++){
		f[i]=(f[i-1]+(i-1)/2-i/3+mod)%mod;
		if (i%3==0)
			f[i]=(f[i]+1)%mod;
		if (i%2==0)
			f[i]=(f[i]-i/4+mod)%mod;
		Pow[i]=Pow[i-1]*2%mod;
	}
	for (int i=1;i<N;i++)
		for (int j=i*2;j<N;j+=i)
			f[j]=(f[j]-f[i]+mod)%mod;
	while (~scanf("%d",&n)){
		int ans=0;
		for (int i=1;i*i<=n;i++)
			if (n%i==0){
				ans=(1LL*f[i]*Pow[n/i-1]+ans)%mod;
				if (i*i!=n)
					ans=(1LL*f[n/i]*Pow[i-1]+ans)%mod;
			}
		printf("Case %d: %d\n",++Case,ans);
	}
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/zhouzhendong/p/HDU4466.html
今日推荐