题目链接:点击打开链接
题意:给n,m。求x(1<=x<=n)的和,其中gcd(x,n)>=m。
学习了,一个欧拉函数求和的问题。
Euler_sum(n)=n*Euler(n)/2;也就是求的与n互质的数的和。。
代码:
LL Euler_sum(LL n){ if(n==1) return 1;//n==1时候,需要特判。 else return n*Euler(n)/2; }
对该题的话。
我们需要做的就是,枚举n的因子。寻找gcd(x,n)=n的因子。
假设n的因子为d(d>=m),也就说求gcd(x,n)=d。我们知道d*gcd(x/d,n/d)=1;n/d和x/d是互质的。
说也就是求1-n/d内与n/d互质的和。乘以一个d就是x,gcd(x,n)=d和。
表述不清。
直接代码:
#include <cstdio> #include <cstring> #include <cmath> #define bug puts("bingo!") using namespace std; #define LL long long const LL mod=1e9+7; LL Euler(LL n){ LL ans=n; for(LL i=2;i<=sqrt(n);i++){ if(n%i==0){ while(n%i==0) n=n/i; ans=ans/i*(i-1); } } if(n>1) ans=ans/n*(n-1); return ans; } LL Euler_sum(LL n){ if(n==1) return 1; else return n*Euler(n)/2; } int main(){ int T; scanf("%d",&T); while(T--){ LL n,m,ans=0; scanf("%lld%lld",&n,&m); for(int i=1;i*i<=n;i++){ if(n%i==0){ int d; if(i>=m){ d=i; ans=(ans+d*Euler_sum(n/d))%mod; } if(i*i!=n&&n/i>=m){ d=n/i; ans=(ans+d*Euler_sum(n/d))%mod; } } } printf("%lld\n",ans%mod); } return 0; }
数论需要继续学习。。。。。。