zoukankan      html  css  js  c++  java
  • poj2115 C Looooops(exgcd)

    poj2115 C Looooops

    题意:

    对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。

    若在有限次内结束,则输出循环次数。

    否则输出死循环。

    (k位==mod $2^{k}$)

    列出方程:$A+Cxequiv B(modequad 2^{k})$

    转换一下:$Cx+ky=B-A$

    用exgcd解出 $Cx+ky=gcd(C,k)$

    然后把求出的$x*(B-A)/gcd(C,k)$

    再$\% (k/gcd(C,k))$求个最小正整数解

    end.

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #define re register
     5 using namespace std;
     6 typedef long long ll;
     7 ll A,B,C,k,g,x0,y0,q;
     8 void exgcd(ll a,ll b,ll &x,ll &y){
     9     if(!b) g=a,x=1,y=0;
    10     else exgcd(b,a%b,y,x),y-=x*(a/b);
    11 }
    12 int main(){
    13     while(cin>>A>>B>>C>>k){
    14         if(!A&&!B&&!C&&!k) break;
    15         k=1ll<<k; //注意long long 用位运算 要 1ll
    16         exgcd(C,k,x0,y0); q=k/g;
    17         if((B-A)%g) cout<<"FOREVER"<<endl;
    18         else{
    19             x0=(x0*(B-A)/g%q+q)%q;
    20             cout<<x0<<endl;
    21         }
    22     }return 0;
    23 }
    View Code
  • 相关阅读:
    双循环解决添加列表问题
    贪心算法
    隔板法发红包
    python小兵之时间模块
    开发规范
    python 小兵(12)模块1
    Linux系统
    刷题
    Socket
    栈和队列
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/9899980.html
Copyright © 2011-2022 走看看