题目链接: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))。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
//ax+by=gcd(a,b),d为最后求出的gcd(a,b)
void ex_gcd(LL a,LL b,LL &x,LL &y,LL &d){
if(!b){
d=a;
x=;
y=;
return;
}
ex_gcd(b,a%b,y,x,d);
y=y-a/b*x;
} LL cal(LL a,LL b,LL n){
LL x,y,d;
n++; //n+1
ex_gcd(a,b,x,y,d);
if(n%d) //ax+by=c,gcd(a,b)|c不成立,则无解
return ;
x*=n/d;
y*=n/d;
LL rb=b/d,ra=a/d;
x=(x%rb+rb)%rb; //求出最小的x,每当y-1则x-a/b(约分后为rb/ra),因为解是整数所以x每次只能减少rb,所以最小的x为x%rb。
y=(n-a*x)/b; //最大的y
if(x==) //x不能为0
x+=rb;
if(a*x>n-) //无解
return ;
return +min(y/ra,(n--a*x)/(a*rb));//跟求最小的x时同理,但要满足:①a*x<=n-1 ②y>0
} int main(){
int t;
ios::sync_with_stdio(false);
cin>>t;
while(t--){
int n,a,b;
cin>>n>>a>>b;
cout<<cal(a,b,n)<<endl;
}
return ;
}

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. THUSC2018滚粗记

    THUSC2018滚粗记 前言 大家好,我是\(yyb\),我的博客里又多了一篇滚粗记, 我记得我原来在某篇滚粗记中曾经写过 \(yyb\)还会写很多很多次滚粗记才会有一篇不是滚粗记的东西. 看起来这 ...

  2. Git config配置

    git获取帮助git help config git config --help man git-config   git config --global user.name "fuleyi ...

  3. static_cast 和 dynamic_cast

    1.static_cast static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证 ...

  4. Selective Search for Object Recognition

    http://blog.csdn.net/charwing/article/details/27180421 Selective Search for Object Recognition 是J.R. ...

  5. Redundant data in update statements

    Q:   Hibernate generates UPDATE statements, which include all columns, regardless of whether I'm cha ...

  6. 51nod 1225 数学

    F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数. 例如F(6) = 6 % 1 + 6 % 2 + 6 % 3 + ...

  7. Qt ------ 我定义的规则 之 对象命名规则

    类型 + 特性,比如  button_closeLigth 非公有的变量前面要加上小写m_ (指的修饰符为private时) 静态变量前面加上小写s_ 其它变量以小写字母开头 静态变量全大写 (sta ...

  8. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

  9. JavaSE的学习路线

    基于现阶段的JavaEE学习的对象,主要是趋向于Web的方向,主要就是说在JavaWeb的基础上进行进一步的开发和学习,下面我会将自己总结的对于自己的一点关于JavaEE学习路线会逐步讲解. 第一部分 ...

  10. MyBatis操作oracle的一些问题加载

    mybatis在更新数据或者插入数据为空的时候必须指定jdbcType类型 1:传入的参数是对象类型 User user =new User(); INSERT INTO t_user ( id, u ...