CodeForces 595B Pasha and Phone
Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u
Description
Pasha has recently bought a new phone jPager and started adding his friends’ phone numbers there. Each phone number consists of exactly n digits.
Also Pasha has a number k and two sequences of length n / k (n is divisible by k)
To represent the block of length k as an integer, let’s write it out as a sequence
Pasha asks you to calculate the number of good phone numbers of length n, for the given k, ai and bi. As this number can be too big, print it modulo
Input
The first line of the input contains two integers n and k (1 ≤ n ≤ 100 000, 1 ≤ k ≤ min(n, 9)) — the length of all phone numbers and the length of each block, respectively. It is guaranteed that n is divisible by k.
The second line of the input contains n / k space-separated positive integers — sequence
The third line of the input contains n / k space-separated positive integers — sequence
Output
Print a single integer — the number of good phone numbers of length n modulo
Sample Input
Input
6 2
38 56 49
7 3 4
Output
8
Input
8 2
1 22 3 44
5 4 3 2
Output
32400
Hint
In the first test sample good phone numbers are: 000000, 000098, 005600, 005698, 380000, 380098, 385600, 385698
鏈接在這: 題目鏈接
題意:求n位且滿足以下兩點的號碼數量
把號碼分成k份(可能以0開頭)
1. 第i份是
2. 第i份不能是以
按份for循環找一遍,再取模相乘
注意討論
代碼:
#include<stdio.h>
#define mod 1000000007
int a[100005];
int b[100005];
int ans[100005];
long long mypow(int a,int b)
{
long long ans=1;
for(int i=0; i<b; i++)
ans*=10;
return ans;
}
int main()
{
int n,k;
while(~scanf("%d %d",&n,&k))
{
for(int i=0; i<n/k; i++)
scanf("%d",&a[i]);
for(int i=0; i<n/k; i++)
scanf("%d",&b[i]);
for(int i=0; i<n/k; i++)
{
if(b[i]==0)
{
ans[i]+=((mypow(10,k)-1)/a[i])+1;
ans[i]-=(mypow(10,k-1)-1)/a[i]+1;
}
else
{
ans[i]+=((mypow(10,k)-1)/a[i])+1;
ans[i]-=(mypow(10,k-1)*(b[i]+1)-1)/a[i]-(mypow(10,k-1)*(b[i])-1)/a[i];
}
}
long long ans2=1;
for(int i=0; i<n/k; i++)
{
ans2*=ans[i];
ans2%=mod;
}
printf("%lld\n",ans2);
}
return 0;
}