POJ 2115 C Looooops扩展欧几里得
题意不难理解,看了后就能得出下列式子:
(A+C*x-B)mod(2^k)=0
即(C*x)mod(2^k)=(B-A)mod(2^k)
利用模线性方程(线性同余方程)即可求解
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; typedef long long ll;
ll exgcd(ll a, ll b, ll&x, ll&y) {
if (b == ) {
x = ;
y = ;
return a;
}
ll r = exgcd(b, a%b, y, x);
ll t = x;
y = y - a/b*t;
return r;
}
bool modular_linear_equation(ll a, ll b, ll n) {
ll x, y, x0, i;
ll d = exgcd(a, n, x, y);
if (b%d)
{
printf("FOREVER\n");
return false;
}
x0 = x*(b/d)%n; //x0为方程的一个特解,可以为正也可以为负。题目要求的是最小的非负数
ll ans;
if(x0<)
{
ans=x0;
for(i = ;ans<; i++)
ans=(x0 + i*(n/d))%n;
}
else
{
ans=x0;
ll temp;
for(i=;ans>=;i++)
{
temp=ans;
ans=(x0 - i*(n/d))%n;
}
ans=temp;
}
printf("%I64d\n",ans);
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
ll A,B,C,k;
while(scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&k))
{
if(A== && B== && C== && k==)
break;
ll k2=(ll)<<k;
if(A==B)
printf("0\n");
else
modular_linear_equation(C,B-A,k2);
}
return ;
}
POJ 2115 C Looooops扩展欧几里得的更多相关文章
- POJ 2115 C Looooops(扩展欧几里得应用)
题目地址:POJ 2115 水题. . 公式非常好推.最直接的公式就是a+n*c==b+m*2^k.然后能够变形为模线性方程的样子,就是 n*c+m*2^k==b-a.即求n*c==(b-a)mod( ...
- POJ 2115 C Looooops(扩展欧几里得)
辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a ...
- poj2115 C Looooops——扩展欧几里得
题目:http://poj.org/problem?id=2115 就是扩展欧几里得呗: 然而忘记除公约数... 代码如下: #include<iostream> #include< ...
- C Looooops(扩展欧几里得+模线性方程)
http://poj.org/problem?id=2115 题意:给出A,B,C和k(k表示变量是在k位机下的无符号整数),判断循环次数,不能终止输出"FOREVER". 即转化 ...
- POJ 2142 - The Balance [ 扩展欧几里得 ]
题意: 给定 a b n找到满足ax+by=n 的x,y 令|x|+|y|最小(等时令a|x|+b|y|最小) 分析: 算法一定是扩展欧几里得. 最小的时候一定是 x 是最小正值 或者 y 是最小正值 ...
- POJ - 2115C Looooops 扩展欧几里得(做的少了无法一眼看出)
题目大意&&分析: for (variable = A; variable != B; variable += C) statement;这个循环式子表示a+c*n(n为整数)==b是 ...
- poj 2115 C Looooops 扩展欧几里德
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23616 Accepted: 6517 Descr ...
- POJ2115 C Looooops[扩展欧几里得]
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24355 Accepted: 6788 Descr ...
- C Looooops(扩展欧几里得)
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20128 Accepted: 5405 Descripti ...
随机推荐
- java 反编译利器JD-JUI
下载地址: http://download.csdn.net/download/suixingbugai/4145221
- 《SQL必知必会》—— 读后总结
- c# 文件属性读取操作及文件之间操作
c# 获取文件最后修改日期代码FileInfo f = new FileInfo(@"c:\1.txt");Console.WriteLine(f.LastWriteTime.To ...
- 由于Replication,DBCC Shrink不能收缩Log File
使用Backup创建测试环境之后,发现testdb的Log File过大,达到400GB,由于测试环境实际上不需要这么大的Log Space,占用400GB的Disk Space实在浪费Disk Re ...
- VMware Workstation and Hyper-V are not compatible. 解决方案
VMware 和 Hyper-V 不能共存问题报错如下:VMware Workstation and Hyper-V are notcompatible. Remove the Hyper-V rol ...
- 用pageGroup.js实现分页功能
1.html页面中 引入 <link rel="stylesheet" type="text/css" href="/stylesheets/p ...
- JAVA实现发送电子邮件
相信大家对于网站也好,手机app也好,用户注册时,需要进行邮箱验证的功能特别好奇吧,本篇我将带领大家一起实现一下这个简单而又神奇的小功能,让我们的应用也可以加入这些神奇的元素.废话不多说,下面开始我们 ...
- jQuery源码 Ajax模块分析
写在前面: 先讲讲ajax中的相关函数,然后结合函数功能来具体分析源代码. 相关函数: >>ajax全局事件处理程序 .ajaxStart(handler) 注册一个ajaxStart事件 ...
- AngularJS API之$injector ---- 依赖注入
在AngularJS中也有依赖注入的概念,像spring中的依赖注入,但是又有所不同.Spring中使用构造注入或者设值注入的方式,还需要做一些额外的操作,但是angular中只需要在需要的地方声明一 ...
- js操作label,给label赋值,和取label的值
取值:var Label_text=document.getElementById('test_label').innerHTML; 赋值:document.getElementById('test_ ...