题面
演演是个厉害的数学家,他最近又迷上了数字谜。。。。
他很好奇 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;
}
}
}