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; }