题目:
题意:
统计一下
aaa...aaan个a∗b
的结果里面有多少个数字d,a,b,d均为一位数。
样例解释:
3333333333*3=9999999999,里面有10个9。
Input
多组测试数据。
第一行有一个整数T,表示测试数据的数目。(1≤T≤5000)
接下来有T行,每一行表示一组测试数据,有4个整数a,b,d,n。 (1≤a,b≤9,0≤d≤9,1≤n≤10^9)
Output
对于每一组数据,输出一个整数占一行,表示答案。
思路:
找规律,可以发现,当n大于等于3的时候,此时n再增加的话,最后的乘积的变化就是不断在其中插入某个数字,而这个数字是可以算出来
#include <bits/stdc++.h>
using namespace std;
const int N = 10 + 10;
int num[N];
int main()
{
int t, a, b, d, n;
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d%d", &a, &b, &d, &n);
memset(num, 0, sizeof num);
int val = 0;
for(int i = 1; i <= min(n, 3); i++) val = val * 10 + a;
val *= b;
if(n < 3)//此时直接算
{
while(val) num[val%10]++, val /= 10;
printf("%d\n", num[d]);
}
else
{
int k = 0, arr[N];
while(val) arr[++k] = val % 10, val /= 10;
if(k == 3) num[arr[k]] = n;//没发生进位,说明所有数字都一样,共n个
else
{//发生进位,可以发现如果n继续增大,只是不断的往乘积中增加arr[3]这个数字
num[arr[1]]++, num[arr[2]]++, num[arr[4]]++;
num[arr[3]] += n - 2;
}
printf("%d\n", num[d]);
}
}
return 0;
}