這是今天想通的一個(gè)數(shù)論題,還是挺有意思的,想出來(lái)的那一瞬間yeah了一下,可是我悲劇的粗心習(xí)慣,還是交了3次才過(guò),nm數(shù)中間空
格都錯(cuò)了,又忘記打空行,明明字符串從25列開(kāi)始,中間是4個(gè)空格的,我nc的打了5個(gè)空格,就pe了,還有不仔細(xì)看輸出要求,沒(méi)有輸出空
行,最近真沒(méi)狀態(tài)啊。
其實(shí),這個(gè)題想通了就很簡(jiǎn)單了,還是數(shù)論里面的群的概念,就是加法群的生成群啊,打著隨機(jī)數(shù)的幌子而已。由于又沒(méi)有限定種子,限定
對(duì)答案也沒(méi)有影響,假設(shè)種子是0,那么數(shù)列可以表示為a*step,數(shù)列要能夠生成0 - mod-1中所有的數(shù)字,那么就有a*step = b % mod
(0<=b<mod)。
哈哈,上面那個(gè)式子就是a*x=b%n這個(gè)線性同余方程了,只是有很多b了。要方程有解,不是需要滿足條件gcd(a,n)|b么,意思b是
gcd(a,n)的整數(shù)倍了。但是0<=b<n啊,b會(huì)是1了,那么gcd(a,n)一定是1了哦。那么直接判斷gcd(step,mod)是否為1就行了,哈哈。
關(guān)于線性同余方程a*x=b%n,要有解的條件gcd(a,n)|b的解釋,還是參看算法導(dǎo)論或者其它資料吧。。。
代碼就非常簡(jiǎn)單了,如下:
#include <stdio.h>
#include <algorithm>
using namespace std;
int gcd(int a, int b)
{
if (a < b)swap(a, b);
while (b)
{
int t = a;
a = b;
b = t % b;
}
return a;
}
int main()
{
int nStep, nMod;
while (scanf("%d%d", &nStep, &nMod) == 2)
{
printf("%10d%10d %s\n\n", nStep, nMod,
gcd(nStep, nMod) == 1 ? "Good Choice" : "Bad Choice");
}
return 0;
}