51 Nod 1352 集合计数(中国剩余定理+扩展欧几里得)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51 Nod 1352 集合计数(中国剩余定理+扩展欧几里得)相关的知识,希望对你有一定的参考价值。

题目链接:点我点我

题意:中文题

题解:由题意我们可以构造出方程: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 集合计数(中国剩余定理+扩展欧几里得)的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1352 集合计数

51Nod 1352 集合计数 扩展欧几里得

51 Nod 1079 中国剩余定理(中国剩余定理)

51nod 1352 集合计数(扩展欧几里得)

51nod_1352_集合计数 (exgcd)

51nod1079中国剩余定理