BSG白山极客挑战赛 数数字



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示例
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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值