题解:P9006 [入门赛 #9] 神树大人挥动魔杖 (Hard Version)
发现其他题解都用了比较复杂的方法,这里就上一个极其简单(甚至复杂度更低)的做法吧:
核心思路:快速幂取余
考虑到整个数组每
代码
Python 代码相对简单:
n,k=map(int,input().split());p=pow(10,n,k*100000007)//k;p=[p]*k;q=pow(10,n-1,k*100000007)//k;q=[q]*k#快速幂取余后的商数
for i in range(pow(10,n,k*100000007)%k):p[i]+=1#快速幂取余后的余数
for i in range(pow(10,n-1,k*100000007)%k):q[i]+=1
print(*((p[i]-q[i])%100000007 for i in range(k)))#相减
C/C++ 小心模 long long 的,这里使用 __int128 解决。
#include<stdio.h>
#define t 100000007
__int128 m[13],n,k,i,u,v,p;
int main()
{
scanf("%d%d",&n,&k);
u=v=1;m[0]=10;
for(i=0;i<12;)m[++i]=(m[i]*m[i])%(k*t);
for(i=0;i<13;i++)if(n&(1<<i))u=u*m[i]%(k*t);
n--;
for(i=0;i<13;i++)if(n&(1<<i))v=v*m[i]%(k*t);
p=u/k-v/k;u%=k;v%=k;
while(p<t)p+=t;
i=0;printf("%d",(p+(i<u)-(i<v))%t);
for(i=1;i<k;i++)printf(" %d",(p+(i<u)-(i<v))%t);
}