1. 程式人生 > >51 Nod 1352 集合計數(中國剩余定理+擴展歐幾裏得)

51 Nod 1352 集合計數(中國剩余定理+擴展歐幾裏得)

會有 方程 www. 而不是 題意 def scan pre urn

題目鏈接:點我點我

題意:中文題

題解:由題意我們可以構造出方程:Ax+By=N+1,用擴展歐幾裏得算出最小的非負整數解x(x確定,y也就確定了),然後再把剩余的數分配掉(以它們的最小公倍數去分)。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 typedef long long LL;
 7 
 8 LL e_gcd(LL a,LL b,LL &x,LL &y){
9 LL d=a; 10 if(b!=0){ 11 d=e_gcd(b,a%b,y,x); 12 y-=(a/b)*x; 13 } 14 else{x=1;y=0;} 15 return d; 16 } 17 18 int main(){ 19 LL t,N,A,B; 20 scanf("%lld",&t); 21 22 while(t--){ 23 LL x,y,ans=0; 24 scanf("%lld %lld %lld
",&N,&A,&B); 25 LL GCD=e_gcd(A,B,x,y); 26 LL lcm=A/GCD*B; 27 if((N+1)%GCD) {printf("0\n");continue;} 28 else{ 29 LL tmp=B/GCD; 30 x=x*(N+1)/GCD; 31 x=(x%tmp+tmp)%tmp;//x的最小非負整數解 32 if(x==0) x=tmp; 33 //
這裏用N而不是N-1是因為如果res/lcm剛好是整數,會有一個不符合條件,-1,保證都符合. 34 LL res=N-x*A; 35 if(res<0) {printf("0\n");continue;} 36 else ans=res/lcm+1; 37 printf("%lld\n",ans); 38 } 39 } 40 41 return 0; 42 }

51 Nod 1352 集合計數(中國剩余定理+擴展歐幾裏得)