count_prime
Time Limit: 1000ms
Memory Limit: 65536KB
Description
给定你一个数n,请你统计出在[a,b]这个区间中和n互质的数的个数。两个数互质当且仅当他们除了1之外没有其他的公共因子或者他们最大的公共因子是1。1和任何数是互素的。
Input
第一行输入一个整数T(1 <= T <= 100),表示T组测试数据。接下来T行,每行3个整数a,b,n(1 <= a <=b <=10^15, 1<= n <= 10^9),用空格隔开。
Output
输出一个整数表示
和n互质
的数的个数。
Sample Input
2 1 10 2 3 10 5
Sample Output
5 6 ACcode:#include <map> #include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <stdlib.h> #include <iostream> #include <algorithm> #define maxn 100 using namespace std; typedef long long ll; ll slove(ll r,ll n){ vector<ll>p; for(ll i=2;i*i<=n;++i) if(n%i==0){ p.push_back(i); while(n%i==0) n/=i; } if(n>1)p.push_back(n); ll sum=0; for(ll msk=1;msk<(1<<p.size());++msk){ ll mult=1,bits=0; for(ll i=0;i<(ll)p.size();++i) if(msk&(1<<i)){ ++bits; mult*=p[i]; } ll cur=r/mult; if(bits%2==1)sum+=cur; else sum-=cur; } return r-sum; } int main(){ int t; ll n,m,k; scanf("%d",&t); while(t--){ scanf("%lld%lld%lld",&n,&m,&k); printf("%lld\n",slove(m,k)-slove(n-1,k)); } return 0; }