POJ 2115-C Looooops-擴充套件歐幾里德演算法
C Looooops
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 21526 | Accepted: 5868 |
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 16 3 7 2 16 7 3 2 16 3 4 2 16 0 0 0 0
Sample Output
0 2 32766 FOREVER
Source
知識點:
#include<iostream>
using namespace std;
//d=ax+by,其中最大公約數d=gcd(a,b),x、y為方程係數,返回值為d、x、y
__int64 EXTENDED_EUCLID(__int64 a,__int64 b,__int64& x,__int64& y)
{
if(b==0)
{
x=1;
y=0;
return a; //d=a,x=1,y=0,此時等式d=ax+by成立
}
__int64 d=EXTENDED_EUCLID(b,a%b,x,y);
__int64 xt=x;
x=y;
y=xt-a/b*y; //係數x、y的取值是為滿足等式d=ax+by
return d;
}
int main(void)
{
__int64 A,B,C,k;
while(scanf("%I64d %I64d %I64d %I64d",&A,&B,&C,&k))
{
if(!A && !B && !C && !k)
break;
__int64 a=C;
__int64 b=B-A;
__int64 n=(__int64)1<<k; //2^k
__int64 x,y;
__int64 d=EXTENDED_EUCLID(a,n,x,y); //求a,n的最大公約數d=gcd(a,n)和方程d=ax+by的係數x、y
if(b%d!=0) //方程 ax=b(mod n) 無解
cout<<"FOREVER"<<endl;
else
{
x=(x*(b/d))%n; //方程ax=b(mod n)的最小解
x=(x%(n/d)+n/d)%(n/d); //方程ax=b(mod n)的最整數小解
printf("%I64d\n",x);
}
}
return 0;
}
相關文章
- C Looooops(poj2115+擴充套件歐幾里德)OOP套件
- 【總結】理解歐幾里德及擴充套件歐幾里德演算法套件演算法
- 學習筆記----擴充套件歐幾里德筆記套件
- One Person Game(zoj3593+擴充套件歐幾里德)GAM套件
- HDU 1222 Wolf and Rabbit (擴充套件歐幾里德應用)套件
- POJ 2891 Strange Way to Express Integers(擴充套件GCD)Express套件GC
- POJ1061擴充套件歐幾里得定理套件
- POJ 1733 Parity【擴充套件域並查集】套件並查集
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 淺談擴充套件歐幾里得演算法套件演算法
- 數論入門基礎(同餘定理/費馬小定理/擴充套件歐幾里德演算法/中國剩餘定理)套件演算法
- WCF擴充套件:行為擴充套件Behavior Extension套件
- 歐幾里得演算法與擴充套件歐幾里得演算法演算法套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- Sanic 擴充套件套件
- ORACLE 擴充套件Oracle套件
- 擴充套件工具套件
- 擴充套件歐幾里得套件
- DOM擴充套件套件
- 擴充套件ACL套件
- Lua擴充套件套件
- 照片擴充套件套件
- 擴充套件篇套件
- disable or 擴充套件套件
- 擴充套件表套件
- Mybatis擴充套件MyBatis套件
- POJ 2492 A bug's life【擴充套件域 | 邊帶權並查集】套件並查集
- JMeter 擴充套件開發:擴充套件 TCP 取樣器JMeter套件TCP
- 神奇的字串匹配:擴充套件KMP演算法字串匹配套件KMP演算法
- 擴充套件歐幾里得演算法公式快速推導套件演算法公式
- ?用Chrome擴充套件管理器, 管理你的擴充套件Chrome套件
- ASP.NET Core擴充套件庫之Http通用擴充套件ASP.NET套件HTTP
- php7安裝redis擴充套件和memcache擴充套件PHPRedis套件
- POJ 1182 食物鏈【擴充套件域 | 邊帶權並查集】套件並查集
- 分類擴充套件套件
- 擴充套件表示式套件
- 新增php擴充套件PHP套件
- swift擴充套件ExtensionsSwift套件