poj 2115 C Looooops (扩展欧几里得)
2016-06-01 14:53
417 查看
http://poj.org/problem?id=2115
题意:在k位的系统内执行这个for循环,问这个循环多少次结束,k为的系统能表示的最大的数为2^k,超出2^k就从0开始
思路:由题意可得出公式(A + C*x) % 2^k = B,由同余模公式得(A%2^k + (C*x%2^k)) % 2^k = B
A + (C*x%2^k)) = B, C*x%2^k) = B-A, C*x ≡ (B-A) (mod) 2^k,即转换成标准的同余方程,根据扩展欧几里得求C的最小逆元就可以了
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <stack>
#include <vector>
#include <map>
using namespace std;
#define N 1002000
#define INF 0xfffffff
#define PI acos (-1.0)
#define EPS 1e-8
#define met(a, b) memset (a, b, sizeof (a))
typedef long long LL;
void Ex_gcd (LL a, LL b, LL &gcd, LL &x, LL &y)
{
if (!b)
{
x = 1;
y = 0;
gcd = a;
}
else
{
Ex_gcd (b, a%b, gcd, y, x);
y -= a/b*x;
}
}
int main ()
{///C*x ≡ (B-A) (mod 2^k)
LL A, B, C, k;
while (scanf ("%I64d %I64d %I64d %I64d", &A, &B, &C, &k), A+B+C+k)
{
LL a = C, b = 1LL<<k;
LL mod = (B-A+b)%b, x, y, gcd;
Ex_gcd (a, b, gcd, x, y);
if (mod%gcd)
{
puts ("FOREVER");
continue;
}
x = x * (mod/gcd) % b;
x = (x%(b/gcd) + b/gcd) % (b/gcd);
printf ("%I64d\n", x);
}
return 0;
}
for (variable = A; variable != B; variable += C) statement;
题意:在k位的系统内执行这个for循环,问这个循环多少次结束,k为的系统能表示的最大的数为2^k,超出2^k就从0开始
思路:由题意可得出公式(A + C*x) % 2^k = B,由同余模公式得(A%2^k + (C*x%2^k)) % 2^k = B
A + (C*x%2^k)) = B, C*x%2^k) = B-A, C*x ≡ (B-A) (mod) 2^k,即转换成标准的同余方程,根据扩展欧几里得求C的最小逆元就可以了
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <stack>
#include <vector>
#include <map>
using namespace std;
#define N 1002000
#define INF 0xfffffff
#define PI acos (-1.0)
#define EPS 1e-8
#define met(a, b) memset (a, b, sizeof (a))
typedef long long LL;
void Ex_gcd (LL a, LL b, LL &gcd, LL &x, LL &y)
{
if (!b)
{
x = 1;
y = 0;
gcd = a;
}
else
{
Ex_gcd (b, a%b, gcd, y, x);
y -= a/b*x;
}
}
int main ()
{///C*x ≡ (B-A) (mod 2^k)
LL A, B, C, k;
while (scanf ("%I64d %I64d %I64d %I64d", &A, &B, &C, &k), A+B+C+k)
{
LL a = C, b = 1LL<<k;
LL mod = (B-A+b)%b, x, y, gcd;
Ex_gcd (a, b, gcd, x, y);
if (mod%gcd)
{
puts ("FOREVER");
continue;
}
x = x * (mod/gcd) % b;
x = (x%(b/gcd) + b/gcd) % (b/gcd);
printf ("%I64d\n", x);
}
return 0;
}
相关文章推荐
- 灰度图像阈值化分割常见方法总结及VC实现
- linux下面某些常用命令的用法【转】
- top.location != self.location
- wps for linux 安装
- 用OpenCV批量读取图片的三种方法
- zeppelin-0.5.6+Hadoop-2.5.2+Hive-1.2.1环境构筑及测试
- Linux 计划任务布控
- CentOS 6.4下编译安装MySQL 5.6.14
- 在Docker Swarm上部署Apache Storm:第2部分
- 【转】not found while looking for property错误
- Linux命令启动关闭tomcat部署的项目
- 绝命中的一助linux程序加载器ld-linux.so中的LD_PRELOAD预加载库
- 在Docker Swarm上部署Apache Storm:第2部分
- Linux课题实践三——程序破解
- 上传目录没有写权限(linux系统 php)
- Puppet学习之puppet的安装和配置
- Nginx安装及使用
- 在Linux上配置unixODBC和FreeTDS访问MS SQL Server
- RMQ与LCA(From TopCoder Algorithm Tutorials)
- linux进程通信--共享内存