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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj2115 Looooops(扩展欧几里德模板)

poj2115 Looooops(扩展欧几里德模板) A Compiler Mystery: We are given a C-language style for loop of type for...

poj-2115

各种不会,在网上搜了不少的资料才通过,水到一定程度了 #include #include #include using namespace std; long long x,y,q; long ...

POJ2115-C Looooops

转载请注明出处:優YoU    http://user.qzone.qq.com/289065406/blog/1309394009   大致题意: 对于C的for(i=A ; i!=B ;i +=...

POJ 2115--C Looooops

本题为模线性方程经典题目。 根据题意及同余模定理

POJ2115 C Looooops 一元模线性方程

/* 题目描述:给出程序段for(int i = A ; i!= B ; i+= C) statement ,给出A,B,C,k,已知该程序段的运算中出现 的...

poj2115

题目不难,设计到的知识点也不多。具

POJ 2115 Looooops (扩展欧几里得+调整解)

题目大意:给出一组数 a b c k,问 a + mc = b(mod 2^k)的解m是多少,若有解,则输出最小正解的大小,若没有,输出FOREVER,表明a永远无法通过加c的方式得到b的值。解题思路...

POJ 2115- C Looooops(扩展欧几里德)

C Looooops Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm...

poj 2115

题意: 在一个for循环中.求for(int i=a;i!=b;i+=c){i%=2^d}是否能停止; 思路: 设循环x次 (a+c*x)%(2^d)=b; ((a-b)+c*x)%(2^d...

Poj 2115 C Looooops(exgcd变式)

C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22704 Accepted: 62...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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