GCDTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3358 Accepted Submission(s): 1802 Problem Description 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. Input 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 (2<=N<=1000000000, 1<=M<=N), representing a test case. Output For each test case,output the answer on a single line. Sample Input
3 1 1 10 2 10000 72 Sample Output
1 6 260 Source |
题意:求 i <= n 且 gcd(i,n)>= m 的 i 的个数
思路 :对于所有小于n的最大公约数值一定是n的因子,所以,我们枚举每个符合条件的因子将其欧拉函数累加起来就好了。
#include <bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-----------------"<<endl;
typedef long long ll;
const int maxn = 1e5+10;
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 1010;
ll n , m ;
ll Euler( ll n ){
ll ans = 1;
for(int i = 2 ;i * i <= n ;i++){
if( n % i == 0){
n /= i ;
ans *= ( i - 1 );
while( n % i == 0 ){
n /= i ;
ans *= i;
}
}
}
if (n > 1) ans *= (n - 1);
return ans ;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld", &n , &m);
ll ans = 0;
for(int i = 1; i * i <= n ;i++){
if(n % i != 0) continue;
if(i >= m && i * i != n)
ans += Euler(n / i);
if(n / i >= m)
ans += Euler(i);
}
printf("%lld\n", ans );
}
return 0;
}