数数 (数学)(快速幂+同余定理)

该博客介绍了如何帮助小 Star 解决数数问题,特别是当数到一定数量时会从头开始计数。文章提出了利用数学方法(快速幂和同余定理)来解决这个问题,当P为质数时可以直接计算,否则可以通过转换公式来求解。单组操作的时间复杂度为O(logN)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 数数

【问题描述】
小 Star 还不会数数。有一天他看到了一张奇怪的数表,上面的每一个数各自都由相同数字构成,比如“11111111”“66666” 。于是他想自己从 1 慢慢数到这个数字。多少 Star 有个很不好的习惯,每数到一定个数就会从头开始数起。
现在请你帮忙求出,他最后数出来的数是多少。

【输入】
第一行一个整数 Q,表示数表上总共有多少个数;
以下 Q 行每行三个整数 x、n、p,表示这一次 Star 要数 n 个连续的 x,并且每数到 p 就归零。

【输出】
输出 Q 行,按顺序表示 Star 这一次数出来的数字是多少。

【输入输出样例】
count.in
3
8 5 3
3 3 1
5 3 4
count.out
1
0
3

数据范围

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;
ans,x,n,p,qq:int64;

function fa(x,n:int64):int64;
var t,y:int64;
begin 
t:=x; y:=1;
while n>0 do 
begin 
if n and 1=1 then 
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);
qq:=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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值