這題用數學解,假設一個 good number (ab) 左半的數字是 a,右半的數字是 b,那這個數字可表為 a*(10^n)+b。
a 要整除 a*(10^n)+b,所以 b%a == 0 。 (b是a的倍數)
b 也要整除 a*(10^n)+b,這比較麻煩,為了使b和a同為n位數,1<=b/a<=9,且
n == 1 時,b/a == 1 || b/a == 2 || b/a == 5 。(10的因數) (直接找得14)
n == 2 時,b/a == 1 || b/a == 2 || b/a == 4 || b/a == 5 。(100的因數) (直接找得155)
n >= 3 時,b/a == 1 || b/a == 2 || b/a == 4 || b/a == 5 || b/a == 8 。(1000的因數)
( 數學分析得 25*63*( 10^(n-3) ) )
最後是算 10^(n-3) % m 的速度問題,使用 powmod 函數 (下面的C code),
每次把 x^y 變成 (x*x)^(y/2),達到 log2(n) 的速度,
python 則有 built-in function pow (可以 help(pow) 看看),
下面附 C 和 Python 的 code ~~
#include<stdio.h>
int m;
int powmod(int x, int y){
if(!y){return 1;}
if(y&1){return x*powmod(x*x%m,y>>1)%m;}
return powmod(x*x%m,y>>1);
}
int main(){
int n;
while (scanf("%d%d",&n,&m)!=EOF){
if(n==1){printf("%d\n",14%m);}
else if(n==2){printf("%d\n",155%m);}
else {printf("%d\n",1575*powmod(10,n-3)%m);}
}
return 0;
}
import sys
for s in sys.stdin:
n,m=[int(i) for i in s.split()]
if n==1:
print(14%m)
elif n==2:
print(155%m)
else:
print(1575*pow(10,n-3,m)%m)