题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=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个。

解题思路:

因为第一个元素+第二个元素等于N+1,所以可以列二元一次方程A*x+B*y=N+1求出其中一对解(x0,y0),并得到ra=A/gcd(A,B),rb=B/gcd(A,B),

接下来我们需要求出最小的x,根据方程,我们知道每当y-1则x-A/B(约分后为rb/ra),因为解是整数所以x每次只能减少rb,所以最小的x为x%rb。

于是得到(x1,y1)为x最小,y最大是的情况。接下来求总共有几组解,同理根据上面求最小的x的方法,y每次只能减少ra,x每次只能增加rb。

同时要满足两个条件:①A*x<=n  ②y>0所以最后答案就为1+min(y/ra,(N-A*x)/(A*rb))。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long LL;
  7. //ax+by=gcd(a,b),d为最后求出的gcd(a,b)
  8. void ex_gcd(LL a,LL b,LL &x,LL &y,LL &d){
  9. if(!b){
  10. d=a;
  11. x=;
  12. y=;
  13. return;
  14. }
  15. ex_gcd(b,a%b,y,x,d);
  16. y=y-a/b*x;
  17. }
  18.  
  19. LL cal(LL a,LL b,LL n){
  20. LL x,y,d;
  21. n++; //n+1
  22. ex_gcd(a,b,x,y,d);
  23. if(n%d) //ax+by=c,gcd(a,b)|c不成立,则无解
  24. return ;
  25. x*=n/d;
  26. y*=n/d;
  27. LL rb=b/d,ra=a/d;
  28. x=(x%rb+rb)%rb; //求出最小的x,每当y-1则x-a/b(约分后为rb/ra),因为解是整数所以x每次只能减少rb,所以最小的x为x%rb。
  29. y=(n-a*x)/b; //最大的y
  30. if(x==) //x不能为0
  31. x+=rb;
  32. if(a*x>n-) //无解
  33. return ;
  34. return +min(y/ra,(n--a*x)/(a*rb));//跟求最小的x时同理,但要满足:①a*x<=n-1 ②y>0
  35. }
  36.  
  37. int main(){
  38. int t;
  39. ios::sync_with_stdio(false);
  40. cin>>t;
  41. while(t--){
  42. int n,a,b;
  43. cin>>n>>a>>b;
  44. cout<<cal(a,b,n)<<endl;
  45. }
  46. return ;
  47. }

51Nod 1352 集合计数(扩展欧几里德)的更多相关文章

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

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足 ...

  2. 51 Nod 1352 集合计数

    大致题意:求ax+by=n+1的正数解的个数. 先看下面: 相信看过了通解的参数表示后已经知道怎么解了,贴代码: #include <bits/stdc++.h> #define ll l ...

  3. 51nod 1352:集合计数

    1352 集合计数 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2 ...

  4. 51nod 1352 扩展欧几里德

    给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别 ...

  5. CodeForces 146E - Lucky Subsequence DP+扩展欧几里德求逆元

    题意: 一个数只含有4,7就是lucky数...现在有一串长度为n的数...问这列数有多少个长度为k子串..这些子串不含两个相同的lucky数... 子串的定义..是从这列数中选出的数..只要序号不同 ...

  6. 扩展欧几里德 SGU 106

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=106   题意:求ax + by + c = 0在[x1, x2], [y1, y2 ...

  7. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  8. [BZOJ1407][NOI2002]Savage(扩展欧几里德)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1407 分析: m,n范围都不大,所以可以考虑枚举 先枚举m,然后判定某个m行不行 某个 ...

  9. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

随机推荐

  1. CVE-2017-16995 Ubuntu16.04本地提权漏洞复现

    0x01 前言 该漏洞由Google project zero发现.据悉,该漏洞存在于带有 eBPF bpf(2)系统(CONFIG_BPF_SYSCALL)编译支持的Linux内核中,是一个内存任意 ...

  2. (转载)Cobalt Strike tutorial下针对CVE-2017-0199利用

    CVE-2017-0199利用OLE对象嵌入Word / RTF文档的方式,使得可以在没有用户交互的情况下执行其内容.OLE由许多不同的程序支持,OLE通常用于使在另一个程序中可用的程序中创建的内容. ...

  3. spark(二)

    一.spark的提交模式 --master(standalone\YRAN\mesos) standalone:-client -cluster  如果我们用client模式去提交程序,我们在哪个地方 ...

  4. 《剑指offer》— JavaScript(14)链表中倒数第k个结点

    链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点: 然后两个指针同时 ...

  5. 《剑指offer》— JavaScript(3)从尾到头打印链表

    从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 实现代码 /*function ListNode(x){ this.val = x; this.next = null; }* ...

  6. C++中添加配置文件读写方法

    比如有一个工程,一些变量有可能需要不时的修改,这时候可以通过从配置文件中读取该数值,需要修改时只需要修改配位文件即可. 比如有一个这样的变量m_nTest; 我么可以写两个函数ReadConfig() ...

  7. Netfilter之连接跟踪实现机制初步分析

    Netfilter之连接跟踪实现机制初步分析 原文: http://blog.chinaunix.net/uid-22227409-id-2656910.html 什么是连接跟踪 连接跟踪(CONNT ...

  8. 手动搭建高可用的kubernetes 集群

    之前按照和我一步步部署 kubernetes 集群的步骤一步一步的成功的使用二进制的方式安装了kubernetes集群,在该文档的基础上重新部署了最新的v1.8.2版本,实现了kube-apiserv ...

  9. 协程-遇到I/O自动切换

    参考博客:http://www.cnblogs.com/alex3714/articles/5248247.html 一.前言 Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步 ...

  10. Codeforces 221 B. Little Elephant and Numbers

    B. Little Elephant and Numbers time limit per test 2 seconds memory limit per test 256 megabytes inp ...