數數 (數學)(快速冪 同餘定理)

2021-07-24 12:58:19 字數 1623 閱讀 5504

數數

【問題描述】

小 star 還不會數數。有一天他看到了一張奇怪的數表,上面的每乙個數各自都由相同數字構成,比如「11111111」「66666」 。於是他想自己從 1 慢慢數到這個數字。多少 star 有個很不好的習慣,每數到一定個數就會從頭開始數起。

現在請你幫忙求出,他最後數出來的數是多少。

【輸入】

第一行乙個整數 q,表示數表上總共有多少個數;

以下 q 行每行三個整數 x、n、p,表示這一次 star 要數 n 個連續的 x,並且每數到 p 就歸零。

【輸出】

輸出 q 行,按順序表示 star 這一次數出來的數字是多少。

【輸入輸出樣例】

n 個 x 連在一起,這個數能不能直接表示出來?答案是肯定的,它等於(10^n- 1) / 9 * x。當 p 為質數時,顯然 9 對模 p 有逆元,直接計算即可;若 p 不為質數,我們也只需要根據下式做乙個小小的轉化:

t / k % p = t % kp / k.

(證:t / k = sp + r,0 ≤ r < p,則 t = spk + rk,0 ≤ rk < pk。 )

換言之,我們只要事先將 p 乘上 9,最終再把答案除以 9 就可以

解決不互質的情況了。

單組時間複雜度:o(logn)。

program mys;

var ii,i,j,k,m,q:longint;

function

fa(x,n:int64):int64;

var t,y:int64;

begin

t:=x; y:=1;

while n>0

dobegin

if n and

1=1then

y:=((y mod p)*(t mod p))mod p;

t:=((t mod p)*(t mod p)) mod p;

n:=n div

2;end;

exit(y mod p);

end;

begin

assign(input,'count.in'); reset(input);

assign(output,'count.out'); rewrite(output);

readln(q);

for ii:=1

to q do

begin

readln(x,n,p);

p:=p*9;

ans:=fa(10,n)mod p;

ans:=x*(ans-1

mod p+p) mod p;

ans:=(ans div

9)mod qq;

writeln(ans mod qq);

end;

close(input); close(output);

end.

同餘定理 快速冪

同餘定理 a b c a c b c a c b c c 證明 前一種 a b a c b 為c的 倍數即可 提取b得到 b a a c 易知其為 c的 倍數 得證 一 一般的冪次取餘 主要利用 a b c a c b c ll normal mod ll a,ll b,ll c return an...

快速冪及同餘定理

同餘定理 給定乙個正整數m,如果兩個整數a和b滿足 a b 能夠被m整除,即 a b m得到乙個整數,那麼就稱整數a與b對模m同餘,記作a b mod m 性質 1傳遞性 若a b mod m b c mod m 則a c mod m 2同余式線性運算 若a b mod m c d mod m 則a...

hdu 5106 同餘定理 組合數學 快速冪

首先要取模,就要用到同餘模定理,具體不細講,只是在中間過程取模,防止溢位 在統計時考慮,逐位進行,因為不考慮數本身,所以每當遇到1時,考慮後面還需要n個 還剩多少m位,所以就有c m,n 個數,因為這些數的字首相同,所以最終結果可以通過字首 個數獲得這部分的和,然後考慮每個位上是 的情況是c m 1...