poj2115

原创 2015年07月07日 10:41:59

循环多少次

题目描述:

题意:for(int i = a; i != b; i = (i + c) % (2 ^ k)) 能运行多少次

题解:

其实就是求 ax+by=c,x的最小整数解.

重点:

解的标准步骤:先gcd(a,b),之后同时除以.保证a和b互质.之后求ax+by=1,求出来x之后先%b搞的小一点,之后重点:x*c,之后模的还是b.重点是之后模的还是b

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <ctype.h>
#include <limits.h>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
#define CLR(a) memset(a, 0, sizeof(a))
#define REP(i, a, b) for(ll i = a;i < b;i++)
#define REP_D(i, a, b) for(ll i = a;i <= b;i++)

typedef long long ll;

using namespace std;

ll a, b, c, k, m;

ll gcd(ll a, ll b)
{
    if(b==0)
        return a;
    return gcd(b, a%b);
}
ll ext_gcd(ll a, ll b, ll &x, ll &y)
{
    if(b==0)
    {
        x = 1;
        y = 0;
        return a;
    }
    ll res = ext_gcd(b, a%b, x, y);
    ll t = x;
    x = y;
    y = t - a/b*y;
    return res;
}

void solve()
{
    m = ((1LL) << k);
    ll C = (c - a)%m + m;
    C %= m;
    ll A = b;
    ll B = m;
    ll d = gcd(A, B);
    if(C%d==0)
    {
        A /= d;//先除以gcd
        B /= d;
        C /= d;
        ll x, y;
        ext_gcd(A, B, x, y);
       // x = (x*C/d)%m;
       // x = (x%(B/d)+B/d)%(B/d);
        x = (x%B + B)%B;//x先模b
        x = (x*C);//*c
        x = (x%B + B)%B//模的还是b;
       // x = x%(B*C);
        printf("%I64d\n", x);
    }
    else
    {
        printf("FOREVER\n");
    }
}

int main()
{
   // freopen("3Cin.txt", "r", stdin);
    //freopen("3Cout.txt", "w", stdout);
    while(scanf("%I64d%I64d%I64d%I64d", &a, &c, &b, &k)&&k!=0)
    {
        solve();
    }
    return 0;
}

C Looooops(欧几里德+poj2115)

C Looooops Description A Compiler Mystery: We are given a C-language style for loop of type for (va...
  • u010579068
  • u010579068
  • 2015年05月02日 17:35
  • 1778

poj2115

题目不难,设计到的知识点也不多。具
  • u011725603
  • u011725603
  • 2014年07月26日 14:18
  • 390

poj2115 C Looooops (欧几里德)

C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20515   Ac...
  • d_x_d
  • d_x_d
  • 2015年09月23日 21:04
  • 1069

poj2115(扩展欧几里得)

#include #include #include using namespace std; typedef __int64 ll; ll exgcd(ll a,ll b,ll &x,ll &...
  • NGccc
  • NGccc
  • 2015年05月21日 08:51
  • 186

POJ2115(数论)

#include #include #include using namespace std; typedef long long ll; ll extgcd( ll ...
  • u013570474
  • u013570474
  • 2014年07月23日 21:45
  • 238

poj2115 同余方程

这道题要是有扩展的欧几里得算法基础的,不难想
  • u013983192
  • u013983192
  • 2014年07月14日 21:09
  • 248

模线性方程组(poj2115)

                                ax ≡ b(mod n)两个推论方程 ax ≡ b(mod n)关于 x有解,当且仅当  gcd(a,n) | b。方程 ax ≡ b...
  • kala0
  • kala0
  • 2018年02月21日 12:52
  • 32

poj2115 扩展欧几里德算法小结

以下是学习扩展欧几里德算法的资料的整合,有的转自别处,如百度百科。 扩展欧几里德算法源于欧几里德算法。 欧几里德算法:gcd(a,b)= gcd(b,a%b)。 证明:a可以表示成a = k...
  • Non_Cease
  • Non_Cease
  • 2012年03月17日 15:43
  • 2015

POJ2115 C Looooops(扩展欧几里得)

C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19837   Ac...
  • u013021513
  • u013021513
  • 2015年07月27日 21:49
  • 219

POJ2115 扩展欧几里得

扩展欧几里得模板题 根据题意理出二元一次方程 A+X*C-B=Y*2^k 移项可得X*C+Y*2^k=B-A  然后扩展欧几里得 就得出答案了 #include #include #includ...
  • h6363817
  • h6363817
  • 2013年01月07日 16:31
  • 324
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2115
举报原因:
原因补充:

(最多只允许输入30个字)