近期都是这样的题呢。
。
。。。。
哎
開始想纯暴力(体如今跳出循环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)。