nyoj--1007 GCD
生活随笔
收集整理的這篇文章主要介紹了
nyoj--1007 GCD
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:求滿足i從1 ~ n,使得gcd(i,n) >=m 的i的和
題解:解決這道題我們首先要知道兩點(diǎn)?
1、歐拉定理
我們假設(shè)gcd(n,i) = k,則gcd(n/k,i/k) = 1。即假設(shè)gcd(n/k, x ) = 1,則gcd(n,x*k) = k。gcd(n,i) = k,k的取值是確定的,
即n的所有因子,所以,滿足gcd(n/k,x) = 1個x的個數(shù)即為最大公約數(shù)為k的個數(shù)
2、若gcd(x,n) = 1(n > 1);那么gcd(n-x,n) = 1;那么你懂得~~
注意當(dāng)n為1或2的時候euler(n) = 1;要特殊處理一下
代碼:
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> using namespace std; typedef long long LL; const LL mod = 1000000007; LL euler(LL x) {LL res = x;for(LL i = 2;i <= sqrt(x);i++){if(x%i==0){while(x%i==0) x/=i;res = res/i*(i-1);}}if(x > 1) res = res / x * ( x - 1);return res; } void solve(LL m,LL r) {LL res = 0;for(LL i = 1;i <= sqrt(m);i++){if(m%i==0){if(m/i!=i&&m/i>=r){if(i == 1|| i== 2)res = (res + m/i) % mod;elseres = (res + euler(i) / 2 * i * (m/i))%mod;}if(i >= r){if(m/i == 1|| m/i == 2)res = (res + i)%mod;elseres = (res + euler(m/i) / 2 * (m/i) * i)%mod;}}}printf("%lld\n",res); } int main() { // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout);LL n,k;int t;scanf("%d",&t);while(t--){scanf("%lld%lld",&n,&k);solve(n,k);} }
總結(jié)
以上是生活随笔為你收集整理的nyoj--1007 GCD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nyist --- 组队赛(四)
- 下一篇: 波波老师: 解决微服务的数据一致性分发问