近期都是这样的题呢。

。。。。

開始想纯暴力(体如今跳出循环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)。


posted on 2017-08-08 18:42  lxjshuju  阅读(142)  评论(0编辑  收藏  举报