#12579: a568 ISSC good number 詳解


kirksud (KirkSuD)

學校 : 臺北市立麗山高級中學
編號 : 66737
來源 : [140.115.208.111]
最後登入時間 :
2019-12-30 22:09:01
a568. ISSC 2012- problem B -- ISSC2012 | From: [163.21.208.253] | 發表日期 : 2017-08-14 15:20

這題用數學解,假設一個 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)

 

 
ZeroJudge Forum