BSG白山极客挑战赛 数数字

来源:互联网 发布:淘宝左侧分类模板代码 编辑:程序博客网 时间:2024/04/28 04:02



数数字
System Message (命题人)
yule_z (测试)
基准时间限制:1 秒 空间限制:262144 KB 分值: 20

统计一下 aaa  aaana × 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示例
23 3 9 103 3 0 10
Output示例
100


刚开始看到这道题,我还以为是,模拟呢,结果我看到 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 50000using 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;}



0 0
原创粉丝点击