Amr doesn't like Maths as he finds it really boring, so he usually sleeps in Maths lectures. But one day the teacher suspected that Amr is sleeping and asked him a question to make sure he wasn't.
First he gave Amr two positive integers n and k. Then he asked Amr, how many integer numbers x > 0 exist such that:
- Decimal representation of x (without leading zeroes) consists of exactly n digits;
- There exists some integer y > 0 such that:
- ;
- decimal representation of y is a suffix of decimal representation of x.
As the answer to this question may be pretty huge the teacher asked Amr to output only its remainder modulo a number m.
Can you help Amr escape this embarrassing situation?
Input consists of three integers n, k, m (1 ≤ n ≤ 1000, 1 ≤ k ≤ 100, 1 ≤ m ≤ 109).
Print the required number modulo m.
1 2 1000
4
2 2 1000
45
5 3 1103
590
A suffix of a string S is a non-empty string that can be obtained by removing some number (possibly, zero) of first characters from S.
题解:
dp0[i][j]表示i位数,取余k==j且后缀中没有可以整除k的数的个数。
dp1[i][j]表示取余k==j且后缀中可以整除k的个数。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp0[1002][102],dp1[1002][102],ten[1002];
int main()
{
ll n,k,m;scanf("%lld%lld%lld",&n,&k,&m);
ten[0]=1;
for(int i=1;i<=1000;i++)ten[i]=(ten[i-1]*10)%k;
dp0[0][0]=1;
for(ll i=0;i<n;i++)
{
for(ll j=0;j<k;j++)
{
for(ll z=0;z<=9;z++)
{
if(i==n-1&&z==0)continue;
ll now=(ten[i]*z+j)%k;
if(now==0&&z) dp1[i+1][now]=(dp1[i+1][now]+dp0[i][j])%m;
else dp0[i+1][now]=(dp0[i+1][now]+dp0[i][j])%m;
dp1[i+1][now]=(dp1[i+1][now]+dp1[i][now])%m;
}
}
}
ll ans=0;
for(int i=0;i<k;i++)ans=(ans+dp1[n][i])%m;
printf("%lld\n",ans);
return 0;
}