给定一个 A 进制下的分数 a/b, 小蓝想把它化为 B 进制下的小数 c。 现在他想知道这个小数是不是一个有限小数。
Input
输入共一行,包含四个数 a, b, A, B,表示该分数和两种进制。 其中 A, B 使用十进制表示, a, b 中大于 9 的数字使用大写字母表示, A 表示 10,B 表示 11,以此类推。
Output
输出一行,包含一个字符串。 如果该小数是一个有限小数,则输出 "Yes"; 否则输出 "No"(不包含引号)。
Sample Input
10 11 10 11
Sample Output
Yes
思路:
如果一个数a/b是某进制下有限小数(最小一位位权设为),让其乘B超过i次可以化为十进制整数,而如果是无限小数,无论×多少次,都无法化为十进制整数。
我们可以直接乘一个比较大的,保证有限小数都可以化为十进制整数。
同时在乘的过程中对b不断取余,防止其超过LL范围
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int N = 1e6+1000;
LL A, B;
string a, b;
LL get(string s)
{
LL ans = 0,t=1,x=s.size();
for (int i = x-1; i>=0; i--)
{
if (s[i] <= '9' && s[i] >= '0')
ans += (s[i] - '0') * t;
else if (s[i] <= 'Z' && s[i] >= 'A')
ans += (s[i] - 'A'+10) * t;
t *= A;
}
return ans;
}
int main() {
cin >> a >> b >> A >> B;
LL aa = get(a);
LL bb = get(b);
int i = 1;
aa %= bb;
while (i <=bb+10&&aa)
{
aa *= B;
aa = aa % bb;
i++;
}
if (!aa)
printf("Yes\n");
else
printf("No\n");
return 0;
}