模线性方程
来源:互联网 发布:linux重启weblogic服务 编辑:程序博客网 时间:2024/05/01 08:41
poj2115
大致题意:
对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。
若在有限次内结束,则输出循环次数。
否则输出死循环。
解题思路:根据题意可得方程:
A+C*X=B (X 再%2^k 就是最后要的结果。)
X=[(B-A) / C]% 2^k
=[(B-A) % 2^k] / C (C 不需要%,因为 (0 <= A, B, C < 2k) )
=[(B-A)+2^k]%2^k /C
CX=[(B-A)+2^k]%2^k (说明 (B-A)与CX 关于 2^k 同余)
所以 CX - (B-A) 是 2^k 的整数倍 PS:因为两个%它 余数相同的话,,两个相减就把余数减掉了!
所以得到方程:
C*X+Y*2^k=(B-A) PS:(Y是倍数,X即为所求)
解法就很清晰了!
先用 exgcd 求出一组解,然后再模一下 求出 最小解就ok了!
FOREVER 的情况就是(B-A)%gcd 不是整数的情况。。即无限循环!!
//Accepted132K0MSC++646B#include<iostream>#include<cstdio>using namespace std;typedef long long ll;void exgcd(ll a,ll b,ll& d,ll& x,ll& y){ if(!b){d=a;x=1;y=0;} else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}}ll mod(ll a,ll b,ll n){ ll d,x,y,l; exgcd(a,n,d,x,y); if(b%d!=0) return -1; x*=b/d; l=n/d; x=(x%l+l)%l; return x;}int main(){ ll A,B,C,k; while(~scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&k)) { if(A==0&&B==0&&C==0&&k==0) break; ll flag; flag=mod(C,B-A,1LL<<k); if(flag==-1)printf("FOREVER\n"); else printf("%I64d\n",flag); } return 0;}
0 0
- 模线性方程
- 模线性方程
- 模线性方程
- 模线性方程
- 求解模线性方程
- 求解模线性方程
- SGU 106 模线性方程
- POJ 2115 模线性方程
- 求解模线性方程
- 【求解模线性方程】
- 模线性方程(组)
- C Looooops--模线性方程
- 求解模线性方程
- 扩展gcd&模线性方程
- 线性方程
- hdu 1576 求解模线性方程
- POJ_2142_The Balance(模线性方程)
- Modular Inverse(模线性方程)
- 小白dp 10626 - Buying Coke
- 文字探险游戏,基于cmd显示.花了3个小时,技术非常不成熟
- Mac.OS.X.Programming
- 设计模式学习笔记——访问者模式
- 善用 Eclipse 组合键,提高输入效率
- 模线性方程
- O(n)
- hdu 2340 Obfuscation
- LeetCode OJ:Combination Sum
- phonegap3.3学习(一)---配置
- ZOJ 3752 The Three Guys
- OSGi原理与最佳实践(精选版
- 第6章 Android应用的资源
- 电商seo培训之卖家搜索优化步骤