數數
【問題描述】
小 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...