程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva 408 - Uniform Generator

uva 408 - Uniform Generator

編輯:C++入門知識

 這是今天想通的一個數論題,還是挺有意思的,想出來的那一瞬間yeah了一下,可是我悲劇的粗心習慣,還是交了3次才過,nm數中間空
格都錯了,又忘記打空行,明明字符串從25列開始,中間是4個空格的,我nc的打了5個空格,就pe了,還有不仔細看輸出要求,沒有輸出空
行,最近真沒狀態啊。
   其實,這個題想通了就很簡單了,還是數論裡面的群的概念,就是加法群的生成群啊,打著隨機數的幌子而已。由於又沒有限定種子,限定
對答案也沒有影響,假設種子是0,那麼數列可以表示為a*step,數列要能夠生成0 - mod-1中所有的數字,那麼就有a*step = b % mod
(0<=b<mod)。
   哈哈,上面那個式子就是a*x=b%n這個線性同余方程了,只是有很多b了。要方程有解,不是需要滿足條件gcd(a,n)|b麼,意思b是
gcd(a,n)的整數倍了。但是0<=b<n啊,b會是1了,那麼gcd(a,n)一定是1了哦。那麼直接判斷gcd(step,mod)是否為1就行了,哈哈。
   關於線性同余方程a*x=b%n,要有解的條件gcd(a,n)|b的解釋,還是參看算法導論或者其它資料吧。。。

代碼就非常簡單了,如下:
#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;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved