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 }
时间: 2024-10-13 00:54:39

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

【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】[BZOJ 1951] 古代猪文

[Description] 求 [Solution] 容易得到, 所以,重点在怎么求 如果是p-1是个质数,我们可以用sqrt(n)的时间枚举所有d,用Lucas定理分别计算求和即可. 但是我们发现p-1=2*3*4679*35617,并不是一个质数,所以Lucas定理不能用了吗?并不,我们可以算出这个合式分别对2.3.4679.35617的模值,写出四个同余方程,再用孙子定理求解即可.注意特判g==p的情况,此时费马小定理不成立,ans=0. [Code] #include<cmath> #

扩展欧几里得(ex_gcd),中国剩余定理(CRT)讲解 有代码

扩展欧几里得算法 求逆元就不说了. ax+by=c 这个怎么求,很好推. 设d=gcd(a,b) 满足d|c方程有解,否则无解. 扩展欧几里得求出来的解是 x是 ax+by=gcd(a,b)的解. 对于c的话只需要x*c/gcd(a,b)%(b/d)即可,因为b/d的剩余系更小. 为什么这样呢? 设a'=a/d,b'=b/d 求出a'x+b'y=1的解,两边同时乘d,然后x也是ax+by=d的解, 然后因为b'的剩余系更小,所以%b’ 中国剩余定理是合并线性方程组的 中国余数定理 转化为一个线性

Strange Way to Express Integers POJ 2891(中国剩余定理扩展)

原题 题目链接 题目分析 题意很明确,这里的模数是不互质的,因此不能直接套中国剩余定理.这里稍微讲一下中国剩余定理的扩展,假设前i个方程的特解为ans(i),通解为x(i)=ans(i)+k*lcm(前i个模数).把x(i)代入到第i+1个方程,用扩展欧几里得定理求解k=k0,ans(i+1)=ans(i)+k0*lcm(前i个模数),则x(i+1)=ans(i+1)+lcm(前i+1个模数).大概思路就是这样,但有些细节需要注意一下,求出来的k0,ans(i+1)需要用求模的方法缩小一下. 代

51 nod 1610 路径计数(Moblus+dp)

1610 路径计数 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图.T次修改操作,每次修改一条边的边权,每次修改后输出有向无环图上路径的值为1的路径数量(对1,000,000,007取模). Input 第一行两个整数n和m,分别表示有向无环图上的点数和边数.(1<=n<=100,1<=m<=50,000) 第2~m+1行每行三个数x,y,z,表示有一条从x到y权值为z的边.(1

51nod 1352 集合计数

给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别是:{1,10},{2,9},{3,8},{4,7},{5,6},{6,5},{7,4},{8,3},{9,2},{10,1}.满足条件的是第2个和第8个. Input 第1行:1个整数T(1<=T<=50000),表示有多少组测试数据. 第2 - T+1行:每行三个整数N,A,B(1<=N

[ACM] hdu 3923 Invoker (Poyla计数,高速幂运算,扩展欧几里得或费马小定理)

Invoker Problem Description On of Vance's favourite hero is Invoker, Kael. As many people knows Kael can control the elements and combine them to invoke a powerful skill. Vance like Kael very much so he changes the map to make Kael more powerful. In

[ACM] hdu 3923 Invoker (Poyla计数,快速幂运算,扩展欧几里得或费马小定理)

Invoker Problem Description On of Vance's favourite hero is Invoker, Kael. As many people knows Kael can control the elements and combine them to invoke a powerful skill. Vance like Kael very much so he changes the map to make Kael more powerful. In

gcd,扩展欧几里得,中国剩余定理

1.gcd: int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } 2.中国剩余定理: 题目:学生A依次给n个整数a[],学生B相应给n个正整数m[]且两两互素,老师提出问题:有一正整数ans,对于每一对数,都有:(ans-a[i])mod m[i]=0.求此数最小为多少. 输入样例: 1 10 2 3 1 2 3 2 3 5 8 1 2 3 4 5 6 7 8 97 89 67 61 59 53 47 88 12 1 2 3 4 5 6 7 8 9

扩展欧几里得及中国剩余定理

Exgcd 扩展欧几里得 void exgcd(int a,int b,int &x,int &y){ if(!b){x=1,y=0;return;} exgcd(b,a%b,x,y);b-=y*(a/b); } 对于 \(gcd(a,b)=g\) ,\(a\times k_1+b\times k_2 =g\) 通过 \(exgcd(a,b,x,y)\) \(k_1=x+k\times b\) 对于 \(gcd(a,b)=g\) ,\(a\times k_1+b\times k_2=C\t