/*
プログラミングのお題スレ Part13
https://m...content-available-to-author-only...h.net/test/read.cgi/tech/1549160513/
632デフォルトの名無しさん2019/03/12(火) 19:26:28.38ID:mUEXbKn8
お題
数列a[i]を考える。
a[0] = p
a[i+1] = q * a[i] + r
[入力]
p q r n
(p,q,r,nは整数)
(0≦p,q,r≦99)
(0≦n≦10^10)
[出力]
a[n] mod 13 を求めよ
1 2 0 8
=> 9 (2^8 mod 13)
1 0 99 0
=> 1
1 2 3 2
=> 0 (a[0]=1, a[1]=2*1+3=5, a[2]=2*5+3=13)
1 3 5 10000000000
=> ?
*/
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_MOD_NUM 13 //デフォルトの剰余、13以外では動作未確認
int main(int argc, char *argv[]){
int p;
int q;
int r;
int n;
int a[(DEFAULT_MOD_NUM - 1) * 2]; //数列の範囲, MOD-1の周期になるっぽい, 周期数を調べるため2倍の長さを取得
int length = (DEFAULT_MOD_NUM - 1) * 2; //配列の長さ
int period; //周期
int flag; //フラグ用
int ci; //カウンタ
int cj; //カウンタ
//データ入力値の確認
flag = 0;
if( !(p >= 0) ){
puts("pの値が不正です。0≦ pを満たす必要があります"); flag = 1;
}
if( !(r <= 99) ){
puts("rの値が不正です。r≦ 99を満たす必要があります。"); flag = 1;
}
if( !(0 <= n && n <= 10000000000) ){
puts("nの値が不正です。0≦ n≦ 10^10を満たす必要があります。"); flag = 1;
}
if(flag == 1){
}
//数列を計算
a[0] = p;
for(ci = 1; ci < length; ci++){
a[ci] = (q * a[ci - 1] + r) % DEFAULT_MOD_NUM;
}
//数列の周期を調べる
for(ci = 0; ci < DEFAULT_MOD_NUM - 1; ci++){
flag = 1;
for(cj = 0; cj < length; cj++){
if(a[cj] != a[cj % (ci + 1)]){
flag = 0;
break;
}
}
if(flag == 1){
period = ci + 1;
break;
}
//一応DEFAULT_MOD_NUM-1以上の周期は無いはずだが、発生した場合、終了する。
if(ci > DEFAULT_MOD_NUM){
puts("周期がDEFAULT_MOD_NUM-1を超えました。終了します。"); }
}
//数列の「nの周期数による剰余」番目の項が答え。
printf("=> %d\n", a
[(n
% period
)]);
return 0;
}
LyoK44OX44Ot44Kw44Op44Of44Oz44Kw44Gu44GK6aGM44K544OsIFBhcnQxMwpodHRwczovL20uLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmgubmV0L3Rlc3QvcmVhZC5jZ2kvdGVjaC8xNTQ5MTYwNTEzLwoKNjMy44OH44OV44Kp44Or44OI44Gu5ZCN54Sh44GX44GV44KTMjAxOS8wMy8xMijngaspIDE5OjI2OjI4LjM4SUQ6bVVFWGJLbjgK44GK6aGMIArmlbDliJdhW2ld44KS6ICD44GI44KL44CCIAphWzBdID0gcCAKYVtpKzFdID0gcSAqIGFbaV0gKyByIAoKW+WFpeWKm10gCnAgcSByIG4gCihwLHEscixu44Gv5pW05pWwKSAKKDDiiaZwLHEscuKJpjk5KSAKKDDiiaZu4ommMTBeMTApIAoKW+WHuuWKm10gCmFbbl0gbW9kIDEzIOOCkuaxguOCgeOCiCAKCjEgMiAwIDggCj0+IDkgKDJeOCBtb2QgMTMpIAoKMSAwIDk5IDAgCj0+IDEgCgoxIDIgMyAyIAo9PiAwIChhWzBdPTEsIGFbMV09MioxKzM9NSwgYVsyXT0yKjUrMz0xMykgCgoxIDMgNSAxMDAwMDAwMDAwMCAKPT4gPwoqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2RlZmluZSBERUZBVUxUX01PRF9OVU0gMTMgLy/jg4fjg5Xjgqnjg6vjg4jjga7libDkvZnjgIExM+S7peWkluOBp+OBr+WLleS9nOacqueiuuiqjQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSl7CiAgaW50IHA7CiAgaW50IHE7CiAgaW50IHI7CiAgaW50IG47CiAgc2NhbmYoIiVkIiwmcCk7CiAgc2NhbmYoIiVkIiwmcSk7CiAgc2NhbmYoIiVkIiwmcik7CiAgc2NhbmYoIiVkIiwmbik7CgogIGludCBhWyhERUZBVUxUX01PRF9OVU0gLSAxKSAqIDJdOyAvL+aVsOWIl+OBruevhOWbsiwgTU9ELTHjga7lkajmnJ/jgavjgarjgovjgaPjgb3jgYQsIOWRqOacn+aVsOOCkuiqv+OBueOCi+OBn+OCgTLlgI3jga7plbfjgZXjgpLlj5blvpcKICBpbnQgbGVuZ3RoID0gKERFRkFVTFRfTU9EX05VTSAtIDEpICogMjsgLy/phY3liJfjga7plbfjgZUKICBpbnQgcGVyaW9kOyAvL+WRqOacnwoKICBpbnQgZmxhZzsgLy/jg5Xjg6njgrDnlKgKICBpbnQgY2k7ICAgLy/jgqvjgqbjg7Pjgr8KICBpbnQgY2o7ICAgLy/jgqvjgqbjg7Pjgr8KCiAgLy/jg4fjg7zjgr/lhaXlipvlgKTjga7norroqo0KICBmbGFnID0gMDsKICBpZiggIShwID49IDApICl7CiAgICBwdXRzKCJw44Gu5YCk44GM5LiN5q2j44Gn44GZ44CCMOKJpiBw44KS5rqA44Gf44GZ5b+F6KaB44GM44GC44KK44G+44GZIik7CiAgICBmbGFnID0gMTsKICB9CiAgaWYoICEociA8PSA5OSkgKXsKICAgIHB1dHMoInLjga7lgKTjgYzkuI3mraPjgafjgZnjgIJy4ommIDk544KS5rqA44Gf44GZ5b+F6KaB44GM44GC44KK44G+44GZ44CCIik7CiAgICBmbGFnID0gMTsKICB9CiAgaWYoICEoMCA8PSBuICYmIG4gPD0gMTAwMDAwMDAwMDApICl7CiAgICBwdXRzKCJu44Gu5YCk44GM5LiN5q2j44Gn44GZ44CCMOKJpiBu4ommIDEwXjEw44KS5rqA44Gf44GZ5b+F6KaB44GM44GC44KK44G+44GZ44CCIik7CiAgICBmbGFnID0gMTsKICB9CiAgaWYoZmxhZyA9PSAxKXsKICAgIGV4aXQoMSk7ICAKICB9CgogIC8v5pWw5YiX44KS6KiI566XCiAgYVswXSA9IHA7CiAgZm9yKGNpID0gMTsgY2kgPCBsZW5ndGg7IGNpKyspewogICAgYVtjaV0gPSAocSAqIGFbY2kgLSAxXSArIHIpICUgREVGQVVMVF9NT0RfTlVNOwogIH0KCiAgLy/mlbDliJfjga7lkajmnJ/jgpLoqr/jgbnjgosKICBmb3IoY2kgPSAwOyBjaSA8IERFRkFVTFRfTU9EX05VTSAtIDE7IGNpKyspewogICAgZmxhZyA9IDE7CiAgICBmb3IoY2ogPSAwOyBjaiA8IGxlbmd0aDsgY2orKyl7CiAgICAgIGlmKGFbY2pdICE9IGFbY2ogJSAoY2kgKyAxKV0pewoJZmxhZyA9IDA7CglicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmKGZsYWcgPT0gMSl7CiAgICAgIHBlcmlvZCA9IGNpICsgMTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgLy/kuIDlv5xERUZBVUxUX01PRF9OVU0tMeS7peS4iuOBruWRqOacn+OBr+eEoeOBhOOBr+OBmuOBoOOBjOOAgeeZuueUn+OBl+OBn+WgtOWQiOOAgee1guS6huOBmeOCi+OAggogICAgaWYoY2kgPiBERUZBVUxUX01PRF9OVU0pewogICAgICBwcmludGYoImNpID0gJWRcbiIsY2kpOwogICAgICBwdXRzKCLlkajmnJ/jgYxERUZBVUxUX01PRF9OVU0tMeOCkui2heOBiOOBvuOBl+OBn+OAgue1guS6huOBl+OBvuOBmeOAgiIpOwogICAgICBleGl0KDEpOwogICAgfQogIH0KCiAgLy/mlbDliJfjga7jgIxu44Gu5ZGo5pyf5pWw44Gr44KI44KL5Ymw5L2Z44CN55Wq55uu44Gu6aCF44GM562U44GI44CCCiAgcHJpbnRmKCI9PiAlZFxuIiwgYVsobiAlIHBlcmlvZCldKTsKCiAgcmV0dXJuIDA7Cn0K