51nod1352(exgcd)
题目链接: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)的更多相关文章
- 扩展欧几里得 exGCD
Elementary Number Theory - Extended Euclid Algorithm Time Limit : 1 sec, Memory Limit : 65536 KB Jap ...
- NOIP2012同余方程[exgcd]
题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开 输出格式: 输出只有一行,包含一个正整 ...
- exgcd,求乘法逆元
procedure exgcd(a,b:int64); var t:longint; begin then begin x:=;y:=; exit; end else exgcd(b,a mod b) ...
- 【板子】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 ...
- 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)
4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 290 Solved: 148[Submit][Status ...
- poj1061 Exgcd
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> usin ...
- 51Nod 1256 乘法逆元 Label:exgcd
1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...
- 【BZOJ2242】【SDoi2011】计算器 快速幂+EXGCD+BSGS
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- Poj 2115 C Looooops(exgcd变式)
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22704 Accepted: 6251 Descripti ...
随机推荐
- Android笔记之dp与px之间的转换以及LayoutParams
dp与px之间的转换公式 px = dp * (dpi / 160) dp = px / (dpi / 160) 其中dpi的获取方式如下 private void getDpi() { Displa ...
- HP叫魔术方法的函数
PHP5.0后,php面向对象提成更多方法,使得php更加的强大!! 一些在PHP叫魔术方法的函数,在这里介绍一下:其实在一般的应用中,我们都需要用到他们!! 1.__construct() 当实例化 ...
- RNN 的入门程序DEMO
1.视频介绍 https://www.youtube.com/watch?v=cdLUzrjnlr4 2. https://github.com/llSourcell/recurrent_neural ...
- 自定义fragmentlayout
一.抽取视图文件,实例化需要在xml文件中 先上效果图: 1. 编写 xml布局文件 <?xml version="1.0" encoding="utf-8&qu ...
- spring4.2更好的应用事件
1.基于注解驱动事件监听器:现在可以在一个Bean的方法上使用@EventListener注解来自动注册一个ApplicationListener来匹配方法签名. @Component public ...
- jquery中的attr与prop
http://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html
- Codeforces Round #340 (Div. 2) E. XOR and Favorite Number —— 莫队算法
题目链接:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit per test 4 ...
- MySQL学习笔记(六)—— MySQL自连接
有的时候我们需要对同一表中的数据进行多次检索,这个时候我们可以使用之前学习过的子查询,先查询出需要的数据,再进行一次检索. 例如:一张products表,有产品id,供应商id(vend_id),产品 ...
- 如何把wecenter的推荐的问题模块单独调取出来?
查阅文档: http://wenda.wecenter.com/question/1893 http://www.zhidiu.com/article/1012 http://wenda.wecent ...
- NSMutableURLRequest,在POST方式下传递参数
1. [代码][C/C++]代码 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; NSUs ...