题目链接:https://www.nowcoder.com/acm/contest/89/B
题目:求区间[L,R]内所有与K互质的数之积取模K;(1<= L,R<=1e18,1<=K<=1e5),最多20组测试数据;
flag:数论
**长度区间为K的里面的数取模K后,余数集合均一样,为{0,1,2,3,4,5,6……K-1};
例: K=6, [1,6]求模6的余数集合={1,2,3,4,5,0}
[2,7]求模6的余数集合={2,3,4,5,0,1}
**所以我们只需要判断[K,K+L-1]内有多少个与K互质的数,用num[i]记录这些数,R-L+1=k*K+res;
有k个区间,所以每个num[i]都应有k个,另外[K,K+res-1]内的num[i]额外加1;
#include
#include
#include
#define llt long long
#include
using namespace std;
llt gcd(llt a,llt b){
return (b==0)?a:gcd(b,a%b);
}
llt quick_Pow(llt x,llt K,llt a){
if(a==0)return 1;
if(a==1)return x%K;
llt t=quick_Pow(x,K,a/2);
if(a%2==0) return t*t%K;
return t*t%K*x%K;
}
int num[100010];
int main(){
int T;cin>>T;
int kase=0;
while(T--){
llt L,R;
llt K;
scanf("%lld%lld%lld",&L,&R,&K);
llt k=(R-L+1)/K;
llt res=(R-L+1)%K;
llt idx=-1;
llt temp=0;
for(llt i=0;i