2020NYIST个人积分赛第三场-A

题面

演演是个厉害的数学家,他最近又迷上了数字谜。。。。

他很好奇 xxx…xxx(n个x)*y 的答案中 有多少个z,x,y,z均为位数只有一位的整数。

大概解释一下:

22222*3 = 66666,里面有5个6。

Input
多组测试数据。 第一行有一个整数T,表示测试数据的数目。(1≤T≤5000) 接下来有T行,每一行表示一组测试数据,有4个整数x,y,z,n。 (1≤x,y≤9,0≤z≤9,1≤n≤10^9)
Output
对于每一组数据,输出一个整数占一行,表示答案。
Sample Input
2
2 3 6 5
3 3 0 10
Sample Output
5
0

思路

其实很简单的思路。。就是模拟乘法不过关啊QWQ

多找几个不同的例子可以发现他们的规律:当x * y <10 的时候不会出现进位的问题,即有n个相同的结果。所以只需要判断x * y是否等于z即可。若等于z则有n个z,反之有0个。
当x*y>=10的时候会出现进位问题,所以模拟乘法运算过程来记录等于z有多少个即可。

代码

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#define pi 3.14159265
#define ll long long
using namespace std;
int flag[2020];//记录数组
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		ll x, y, z, n, d;
		cin >> x >> y >> z >> n;
		if (x * y <10)
		{
			if (x * y != z)
				cout << "0" << endl;
			else
				cout << n << endl;
		}
		else
		{
			ll a = x * y / 10;//十位
			ll r = x * y % 10; //个位
			memset(flag, 0, sizeof(flag));//清空数组
			flag[r]++;//先记录个位
			n--;//
			while (n)//模拟乘法运算过程
			{
				r = (x * y + a) % 10;//计算每次相乘并进位后的个位
				a = (x * y + a) / 10;//计算每次想乘并进位后的十位
				if (flag[r])
				{
					flag[r] += n;//一旦有过记录 就表示数字开始重复 且会一直重复下去 会重复n次
					break;
				}
				else
				{
					flag[r]++;//没有记录则表示第一次出现 记录
				}
				n--;
			}
			flag[a]++;
			cout << flag[z] << endl;
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值