POJ 2115 C Looooops(单变元模线性方程)
来源:互联网 发布:jre源码下载 编辑:程序博客网 时间:2024/06/06 12:27
C Looooops
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 20180 Accepted: 5422
Description
A Compiler Mystery: We are given a C-language style for loop of type
I.e., a loop which starts by setting variable to value A and while variable is not equal to B, repeats statement followed by increasing the variable by C. We want to know how many times does the statement get executed for particular values of A, B and C, assuming that all arithmetics is calculated in a k-bit unsigned integer type (with values 0 <= x < 2k) modulo 2k.
for (variable = A; variable != B; variable += C) statement;
I.e., a loop which starts by setting variable to value A and while variable is not equal to B, repeats statement followed by increasing the variable by C. We want to know how many times does the statement get executed for particular values of A, B and C, assuming that all arithmetics is calculated in a k-bit unsigned integer type (with values 0 <= x < 2k) modulo 2k.
Input
The input consists of several instances. Each instance is described by a single line with four integers A, B, C, k separated by a single space. The integer k (1 <= k <= 32) is the number of bits of the control variable of the loop and A, B, C (0 <= A, B, C < 2k) are the parameters of the loop.
The input is finished by a line containing four zeros.
The input is finished by a line containing four zeros.
Output
The output consists of several lines corresponding to the instances on the input. The i-th line contains either the number of executions of the statement in the i-th instance (a single integer number) or the word FOREVER if the loop does not terminate.
Sample Input
3 3 2 163 7 2 167 3 2 163 4 2 160 0 0 0
Sample Output
0232766FOREVER
求 Cx - (2^k)y = B-A中x的最小值
即求 ax - by = c;
先用扩展欧几里得求出 ax - by = gcd(a,b)的解(x,y)
如果c不能整除gcd(a,b)则无解
ax - by = gcd(a,b) 等式两边同时* c/gcd(a,b)得
ax * c/gcd(a,b) - by * c/gcd(a,b) = c
最后的解为 x * c/(gcd) 对 b/gcd(a,b)取余
#include <iostream>#include <cstdio>#include <cstring>#include <stdlib.h>#include <algorithm>#include <queue>#include <map>#include <cmath>#define N 1001#define ll long long int#define eps 1e-8#define PI acos(-1.0)#define inf 0x3f3f3f3fusing namespace std;ll x, y;ll gcd(ll a,ll b){ if(b == 0) { x = 1; y = 0; return a; } ll c = gcd(b, a%b); ll t = x; x = y; y = t - (a/b)*y; return c;}int main(){ ll A, B, C, k; while(~scanf("%I64d%I64d%I64d%I64d", &A, &B, &C, &k)) { if(!A && !B && !C && !k) break; ll a = C; ll b = pow(2,k); ll c = B - A; ll gg = gcd(a, b); if(c%gg) { printf("FOREVER\n"); continue; } x = x * (c/gg) ; // ax - by = gg 变为 ax * c/gg - by * c/gg = c x = (x%(b/gg) + b/gg) % (b/gg); // x = x+k*( b/gg ) 求最小解 printf("%I64d\n",x); } return 0;}
0 0
- POJ 2115 C Looooops(单变元模线性方程)
- poj-2115 C Looooops (单变元模线性方程)
- Poj 2115 C Looooops (模线性方程)
- poj 2115 C Looooops(模线性方程)
- poj 2115 C Looooops (解模线性方程)
- POJ 2115 C Looooops (模线性方程)
- POJ 2115 C Looooops 模线性方程(扩展欧几里得)
- POJ 2115 C Looooops 解题报告(模线性方程)
- [poj 2115]C Looooops[扩展欧几里德][模线性方程]
- POJ 2115 C Looooops 解模线性方程(扩展欧几里得)
- POJ 2115 C Looooops(扩展欧几里德 + 求解模线性方程)
- poj 2115 C Looooops 拓展欧几里德 解模线性方程模板
- C Looooops--模线性方程
- [ACM] POJ 2115 C Looooops (扩展欧几里得求解模线性方程)
- poj 2115 C Looooops
- POJ 2115 C Looooops
- POJ 2115 C Looooops
- POJ 2115 C Looooops
- 安卓系统中的文件读写操作
- UIGraphicsBeginImageContext 生成图片模糊
- 怎么更换eclipse的workspace
- 设计模式笔记(八)--迭代器模式、组合模式
- EditText设置可以编辑和不可编辑状态
- POJ 2115 C Looooops(单变元模线性方程)
- poj2362Square
- Sublime Text 2:安装使用ctags
- pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。
- android cookie持久化
- Android 仿微信联系人Demo
- C语言malloc和free实现原理
- 如何使用Node Profiler
- VC中句柄、指针、ID之间的转换