poj 2115 C Looooops(扩展欧几里德)
来源:互联网 发布:了解算法看哪本书 编辑:程序博客网 时间:2024/06/06 14:08
C Looooops
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 23143 Accepted: 6357
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
大致题意:
对于C的for(i=A ; i!=B ;i +=C)循环语句,问在(mod 2^k)中循环几次才会结束。
使用扩展欧几里德的方法,看不懂的请看我博客的相关知识
代码如下:
Memory: 412KTime: 0MSLanguage: G++Result: AcceptedSource Code#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;long long e_gcd(long long a, long long b, long long &x, long long &y){ if ( b == 0 ) { x = 1; y = 0; return a; } long long ant = e_gcd(b, a%b, x, y); long long temp = x; x = y; y = temp-a/b*y; return ant;}int main(){ int a, b, c, d; while ( ~scanf ( "%d %d %d %d", &a, &b, &c, &d )&&(a != 0||b != 0||c != 0||d != 0) ) { long long x, y; /*扩展欧几里德 相当于cx == ( b-a )( mod pow(2, d) )*/ long long ant = e_gcd(c, pow(2, d), x, y); long long h = b-a; if ( h%ant != 0 ) printf ( "FOREVER\n" ); else { x = x*h/ant; /*通解中正整数中最小的*/ long long s = pow(2,d)/ant; x = (x%s+s)%s; printf ( "%lld\n", x ); } }}
代码菜鸟,如有错误,请多包涵!!!
如有帮助记得支持我一下,谢谢!!!
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(扩展欧几里德)
- poj 2115 C Looooops (扩展欧几里德)
- poj 2115 C Looooops(扩展欧几里德算法)
- [poj 2115]C Looooops[扩展欧几里德][模线性方程]
- POJ 2115 C Looooops(扩展欧几里德 + 求解模线性方程)
- C Looooops poj 2142 扩展欧几里德算法
- POJ 2115 Looooops 扩展欧几里德 Java
- vs常用快捷键
- 三家人
- 【机器学习实战05】PCA降维算法
- 屏蔽输入法
- REDIS安装配置
- poj 2115 C Looooops(扩展欧几里德)
- js addEventListener详解
- C#预编译符
- HDU-5783 Divide the Sequence(贪心水题)
- HDU 1050(贪心)
- Category能否给已有类添加新的属性
- Tensorflow 增加新的操作 op
- PopupWindow进出动画
- 彩印包装印刷行业erp-轻松、易用