统计一下 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
刚开始看到这道题,我还以为是,模拟呢,结果我看到 n 的范围的后,瞬间懵逼,肯定不是模拟了,肯定是找规律了。
首先,因为每位的数值都一样,所以在不进位的情况下每位的结果肯定都一样,但是加上进位就不好说了,但是经过计算你会发现,就算加上进位,在千位 或者 万位开始,他的结果的值都开始不变了,进位的数值都是一样的了,只有万位以下的值会受进位的影响而产生差别,所以,只算后几位就可以了,因为我这里算的是 后 6 位,如果不超过 6 位的,直接计算就行,
附上代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#define LL long long
#define MAX_N 50000
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b,d,n;
scanf("%d%d%d%d",&a,&b,&d,&n);
map<int ,int> Map;
if(n >= 6) // 大于 6 位 和小于 6 位分成两种方式算
{
int num = a * 100000 + a * 10000 + a * 1000 + a* 100 + a * 10 + a;
int sum = num * b;
Map[sum % 1000000 / 100000] = n - 6; // 去除 计算的用的 后 6 位,其他的都和 百万位上的相同
while(sum) // sum 的第一位也就是全数的第一位
{
Map[sum%10]++;
sum /= 10;
}
}
else
{
int num = 0;
for(int i = 0;i < n;i++)
{
num = num * 10 + a;
}
int sum = num * b;
while(sum)
{
Map[sum%10]++;
sum /= 10;
}
}
Map[d]++;
printf("%d\n",Map[d] - 1);
}
return 0;
}