プログラムの実行結果は以下の通り。
656
プログラムのソースは以下の通り。大きな勘違いをしていた。
#include "puzutl.h"
int M, N, P;
const int S = 1000;
int pow6( int n) // 6**n
{
int s = 6;
for( int i=1; i< n; i++) {
s *= 6;
s %= S; // OverFlowを避けるため下3桁のみ
}
s %= N; // 循環をさぼる
return s;
}
int pow3( int n, int m) // n**m
{
int v = 1;
while( m--> 0) {
v = v * n;
v %= S; // 下3桁のみ
}
return v;
}
int main( int argc, cstring argv[])
{
//--------------------------------------------------------------------
// 6x6x6x… の循環を見つける。
//--------------------------------------------------------------------
int num = 6; // 初期値
int loop[S+1] = {0};
for( int i=1; i< S; i++) {
num *= 6;
num %= S; // 下三桁だけを調べて循環を探す
if( loop[num]) { // 循環発見
M = loop[num];
N = i-loop[num];
break;
}
loop[num] = i; // 循環発見用に印を付ける
}
int p = pow6( pow6( pow6( pow6( pow6( 6)))));
int x = pow3( 6, p); // 下3桁のみの6**p
ps( "%d\n", x);
return 0;
}