码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-16 17:26:02      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:bsp   print   str   question   ret   mes   .com   col   logs   

题目链接:点我点我

题意:中文题

题解:由题意我们可以构造出方程: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 集合计数(中国剩余定理+扩展欧几里得)

标签:bsp   print   str   question   ret   mes   .com   col   logs   

原文地址:http://www.cnblogs.com/Leonard-/p/7531528.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!