码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 547A Mike and Frog

时间:2015-07-27 16:24:05      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

最近都是这种题呢。。。。。。

开始想纯暴力(体现在跳出循环t>=那里,,,,),,,,随着数据变大。。。。。(t=499981500166是可以的),,,,,,,23333333

超时代码:

#include <iostream>
#include<bits/stdc++.h>

using namespace std;

int main()
{
    long long int mod;
    scanf("%lld",&mod);
    long long int yuanshi1,mubiao1;
    scanf("%lld%lld",&yuanshi1,&mubiao1);
    long long int x1,y1;
    scanf("%lld%lld",&x1,&y1);
    long long int yuanshi2,mubiao2;
    scanf("%lld%lld",&yuanshi2,&mubiao2);
    long long int x2,y2;
    scanf("%lld%lld",&x2,&y2);
    long long int t=0;
    while(yuanshi1!=mubiao1||yuanshi2!=mubiao2)
    {
        yuanshi1=(x1*yuanshi1+y1)%mod;
        yuanshi2=(x2*yuanshi2+y2)%mod;
        t++;
        if(t>=50000000000)
        {
            printf("-1\n");
            return 0;
        }
    }
    printf("%lld\n",t);
    return 0;
}

很质朴啊。。。。。。


此题最深刻的教训是。。。。以后别对变量瞎起名字!!!!!!

#include <iostream>
#include<bits/stdc++.h>

using namespace std;

int main()
{
    long long int mod;
    scanf("%lld",&mod);
    long long int yuanshi1,mubiao1;
    scanf("%lld%lld",&yuanshi1,&mubiao1);
    long long int x1,y1;
    scanf("%lld%lld",&x1,&y1);
    long long int yuanshi2,mubiao2;
    scanf("%lld%lld",&yuanshi2,&mubiao2);
    long long int x2,y2;
    scanf("%lld%lld",&x2,&y2);
    long long int k1=0,k2=0;
    while(yuanshi1!=mubiao1&&k1<mod)  //先算第一个满足的情况
    {
        yuanshi1=(x1*yuanshi1+y1)%mod;
        yuanshi2=(x2*yuanshi2+y2)%mod;
        k1++;
    }
    if(yuanshi1==mubiao1&&yuanshi2==mubiao2)    //同时第二个也满足了
    {
        printf("%lld\n",k1);
        return 0;
    }
    if(yuanshi1!=mubiao1)        //如果跳出是因为大于了MOD那就没招了(题里给的!)
    {
        printf("-1\n");
        return 0;
    }
    long long int c=1;
    yuanshi1=(yuanshi1*x1+y1)%mod;
    long long int x=x2,y=y2;
        while(yuanshi1!=mubiao1&&c<=mod)    //找两个循环的最小公倍数。。。。。。
        {
            yuanshi1=(yuanshi1*x1+y1)%mod;
            x=(x*x2)%mod;
            y=(x2*y+y2)%mod;
            c++;
        }
        if(yuanshi1!=mubiao1)
        {
            printf("-1\n");
            return 0;
        }
        while(yuanshi2!=mubiao2&&k2<=mod){
            yuanshi2=(yuanshi2*x+y)%mod;
            k2++;
        }
        if(yuanshi2!=mubiao2){
            printf("-1\n");
            return 0;
        }
        printf("%lld\n",k2*c+k1);
    return 0;
}

还可以用拓展欧几里得。。。。。。如果这个线性方程有解,那么一定有gcd(a,b) | m,即a,b的最大公约数能够整除m(m%gcd(a,b)==0)。



版权声明:本文为博主原创文章,未经博主允许不得转载。

codeforces 547A Mike and Frog

标签:

原文地址:http://blog.csdn.net/zhangwenchi/article/details/47085047

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!