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