题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1352

题意:中文题诶~

思路:exgcd

显然题目可以描述为:求a*x+b*y=n+1中满足  1 <= x,y <=n 的解数,

可以先通过exgcd求出一组a*x+b*y=gcd(a, b)的解 x1, y1,那么对应的a*x+b*y=n+1的解就是x1*(n/gcd(a, b)), y1*(n/(gcd(a, b)),

若能求出最小的x解的话,则每隔lcm(a, b), 隔lcm(a, b)出现一组满足条件的解,所以有ans=(n-1-x*a)/lcm(a,b) + 1;

先令x=x1%b,要尽量使x小,所以将大于b的部分放到b*y中去;

令temp=x*a, cc=lcm(a, b)

则有:

  while(temp<1){
            temp+=cc;
        }
        while(temp>0){
            temp-=cc;
        }
        temp+=cc;// 第一个大于0的a*x

将其直接化为公式计算:

  if(temp<1){
            k=ceil(double(1-temp)/cc);
            temp+=cc*k;
        }else{
            k=(temp-1)/cc;
            temp-=cc*k;
        }

答案也就显而易见了,注意中间可能会爆int....

代码:

 #include <iostream>
#include <stdio.h>
#include <math.h>
#define ll long long
using namespace std; int exgcd(ll a, ll b, ll& d, ll& x, ll& y){
if(b==){
x=, y=, d=a;
}else{
exgcd(b, a%b, d, y, x);
y-=(a/b)*x;
}
} int main(void){
int t;
ll n, a, b;
scanf("%d", &t);
while(t--){
scanf("%lld%lld%lld", &n, &a, &b);
ll x, y, d;
exgcd(a, b, d, x, y);
if((++n)%d){ //a*x+b*y=c 当且仅当c=k*gcd(a,b)时有整数解
printf("0\n");
continue;
}
x=x*(n/d)%b; //得到a*x+b*y=n+1的解,若x>b,将大于b的部分放到y*b中
ll cc=a*b/d; //lcm(a,b)
ll temp=x*a;
// while(temp<1){
// temp+=cc;
// }
// while(temp>0){
// temp-=cc;
// }
// temp+=cc;// 第一个大于0的a*x
ll k;
if(temp<){
k=ceil(double(-temp)/cc);
temp+=cc*k;
}else{
k=(temp-)/cc;
temp-=cc*k;
}
if(temp>=n){
printf("0\n");
}else{
printf("%lld\n", (n-temp-)/cc+);//前面给n加了1,但求出的b*y要<=n
}
}
return ;
}

51nod1352(exgcd)的更多相关文章

  1. 扩展欧几里得 exGCD

    Elementary Number Theory - Extended Euclid Algorithm Time Limit : 1 sec, Memory Limit : 65536 KB Jap ...

  2. NOIP2012同余方程[exgcd]

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开 输出格式: 输出只有一行,包含一个正整 ...

  3. exgcd,求乘法逆元

    procedure exgcd(a,b:int64); var t:longint; begin then begin x:=;y:=; exit; end else exgcd(b,a mod b) ...

  4. 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数

    1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...

  5. 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)

    4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 290  Solved: 148[Submit][Status ...

  6. poj1061 Exgcd

    #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> usin ...

  7. 51Nod 1256 乘法逆元 Label:exgcd

    1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...

  8. 【BZOJ2242】【SDoi2011】计算器 快速幂+EXGCD+BSGS

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  9. Poj 2115 C Looooops(exgcd变式)

    C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22704 Accepted: 6251 Descripti ...

随机推荐

  1. FFMPEG SDK流媒体开发2---分离.mp4等输入流音视频而且进行解码输出

    对于FFMPEG SDK  提供的Demuxing 为我们实现多路复用  提供了非常多方便,以下的案案例 实现的是 分离一个媒体文件的音频 视频流 而且解码输出 到  不同的文件里. 对于音频被还原回 ...

  2. STL algorihtm算法iter_swap(29)

    iter_swap原型: std::iter_swap template <class ForwardIterator1, class ForwardIterator2> void ite ...

  3. funhub 独立游戏团队诚邀策划,美术,技术,QA 大大加入(可远程办公)

    我们刚成立的的独立游戏团队,base:广州,团队陆陆续续已经有 6 个成员了,现在还缺的岗位有策划,美术.不过有其 他岗位的仁人志士也可加入. 另外,我们支持远程办公,这是互联网行业的天然优势,一定要 ...

  4. 2015年度新增开源软件排名TOP 100,EasyDarwin开源流媒体服务器排名第17

    本榜单包含 2015 年开源中国新收录的 5977 款开源软件中,根据软件本身的关注度.活跃程度进行排名前 100 名的软件.从这份榜单中或许可以了解到最新业界的趋势. 榜单详情:http://www ...

  5. ThreadPoolTaskExecutor

    我们在开发过程中经常要用到线程池,线程池应该统一管理起来,而不是随用随建.ThreadPoolTaskExecutor——将线程池交给spring管理 1. ThreadPoolTaskExecuto ...

  6. Redis(一)基础数据结构

    1.目录 Redis 基础数据结构 string (字符串) list (列表) hash (字典) set (集合) zset (集合) 容器型数据结构的通用规则 过期时间 2.Redis 基础数据 ...

  7. MFC HTTP(S)请求笔记

    GET示例 #include <afxinet.h> #include <iostream> #include <vector> #ifdef _UNICODE # ...

  8. JBPM工作流简单步骤

    启动流程: 获取最新的流程定义: JbpmContext.getCurrentJbpmContext().getGraphSession().findLatestProcessDefinitions( ...

  9. ALSA lib调用实例

    1. Display Some PCM Types and Formats 2. Opening PCM Device and Setting Parameters /* This example o ...

  10. MFC窗口消息PostMessage和SendMessage

    以前这些消息用得比较少,但是今天碰到了个事儿,我看非用消息不可. 事情是这样的,我在线程中需要刷新对话框上面的内容,但是每每执行到UpdateData时就出现了断言错误. 查了相关资料,发现这个可能是 ...