统计一下 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
对于每一组数据,输出一个整数占一行,表示答案。
Input示例
2 3 3 9 10 3 3 0 10
Output示例
10 0
相同的数字乘以一个个位数位数达到10的9次方,这就能知道直接去找规律,测试几组就能发现到达某种程度之后就会趋于稳定,结果都是某个数字。
直接去模拟就好,特殊数据如 7777 * 4 这就告诉我们从百位开始计算起、
代码如下:
#include<iostream>
#include<cstdio>
#include<map>
#include<math.h>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int t, a, b,d, n;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&a,&b,&d,&n);
if(a * b < 10)//当a * b < 10 结果有n位,而且全部都一样。
{
if(a * b == d)
{
printf("%d\n",n);
}
else
printf("0\n");
continue;
}
int ans[10];
memset(ans, 0, sizeof(ans));
if(n < 3)//当n = 1 或者n = 2时可能有误差
{
for(int i = 0; i < n - 1; i++)
a = a * 10 + a;
int s = a * b;
while(s)
{
ans[s % 10]++;
s /= 10;
}
printf("%d\n",ans[d]);
continue;
}
int x = a * b;
int x1 = x / 10, x2 = x % 10;
int x3 = x1 + x2;
ans[x2]++;
ans[(x+(x1 + x)/10) % 10] = n - 1;//这里是计算乘积的百位数字 可以测试7777 * 4 从第三位开始才相同
if(x3 >= 10)//如果第二位的数字大于10, 计算十位。
{
ans[x3 % 10]++;
ans[(x+(x1 + x)/10) % 10]--;
}
ans[(x+(x1 + x)/10) / 10]++;//最大位
printf("%d\n",ans[d]);
}
return 0;
}