GCD
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the largest divisor common to a and b,For example,(1,2)=1,(12,18)=6.
(a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem:
Given integers N and M,please answer sum of X satisfies 1<=X<=N and (X,N)>=M.
- 输入
- The first line of input is an integer T(T<=100) representing the number of test cases. The following T lines each contains two numbers N and M (1<=N<=10^9, 1<=M<=10^9), representing a test case.
- 输出
- Output the answer mod 1000000007
- 样例输入
-
3 1 1 10 2 10000 72
- 样例输出
-
1 35 1305000
- 上传者
- ACM_张书军
-
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int maxn = 2000; const int moder = 1000000007; ll eular(ll n) { ll ans = n; for(int i=2;i*i <= n;i++){ if(n%i == 0){ ans = ans - ans/i; while(n%i == 0) n = n/i; } } if(n > 1) ans = ans - ans/n; return ans; } ll eular_sum(ll k) { if(k==1||k==2) return 1; else return k*eular(k)/2; } int main() { int t; scanf("%d",&t); while(t--){ ll n,m; scanf("%lld%lld",&n,&m); ll res = 0; for(int i=1;i*i <= n;i++) { if (n % i == 0) { if (i >= m) { res = (res + i * eular_sum(n / i))%moder; } if (i * i != n && n / i >= m){ res = (res + n/i*eular_sum(i))%moder; } } } printf("%lld\n",res); } return 0; }
//求欧拉函数(即n以内所有与n互质的数的个数)
// 设n的质因数分别为p1,p2,.....,pn
//f(x)=n*(1-p1)*(1-p2)*...*(1-pn)
//求与n互质的数之和S(x)=f(x)/2*x