HDU 3501 Calculation 2 ——Dirichlet积

时间:2023-03-09 16:09:46
HDU 3501 Calculation 2 ——Dirichlet积

【题目分析】

卷积太有趣了。

HDU 3501 Calculation 2 ——Dirichlet积

最终得出结论,互质数和为n*phi(n)/2即可。

计算(n*(n+1)/2-n-n*phi(n)/2)%md,用反正法即可证明。

【代码】

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>

#include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 500005
#define md 1000000007
#define ll long long
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)

void Finout()
{
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	#endif
}

int Getint()
{
	int x=0,f=1; char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') x=x*10+ch-'0';
	return x*f;
}

ll n;

ll phi(ll x)
{
	ll t=x,upp=sqrt(x);
	F(i,2,upp)
	{
		if (x%i==0) {t/=i;t*=i-1;}
		while (x%i==0) x/=i;
	}
	if (x>1) t/=x,t*=x-1;
	return t;
}

int main()
{
	Finout();
	while (scanf("%lld",&n)&&n)
		cout<<(n*(n+1)/2-n-n*phi(n)/2)%md<<endl;
}