题目概述
原题参考:B. GCD Length
给出三个整数x、y、z,要求给出满足要求的两个数a,a的十进制长度为x,b的十进制长度为y,gcd(a,b)的十进制长度为z(1<=x, y, z<=9)
思路想法
数字题,二进制沾边和质数沾边的可能性基本就是8成
,二进制和gcd的关系就是一个截断,但是由于有三个数,不太好使,转而向质数;已知,对于任意数都可以拆分为质数的幂次的乘积,那么我们如果给出两个质数相乘,不就可以确定三个数的长度了嘛,比如511=55,523=115,这样可以确定gcd,刚开始是想暴力跑,因为样例数不是很多,也就400多组,但是突然想到一个问题,要是输入是999那还得了,质数就要开到1e9,不靠谱,后面又想到一个222的样例也跑不了,因为最小的就是1111=121,那么就是223
想不明白,跑步的时候想明白了,为什么要增加乘积因子的大小呢,为什么不能增加其幂次让它达到应该的位数呢,然后大致算了一下,应该是可以的,比如443,那么就让gcd = 2^7 = 128,a = 12832=????,b=128*23=1024,也就是说,我可以进行微调,而不是大调
参考代码
#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define pll pair<long long, long long>
#define pii pair<int, int>
#define vi vector<int>
#define vl vector<long long>
#define ll long long
#define ull unsigned long long
const ll INF = 9187201950435737471;
const int inf = 2139062143;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1.0);
ll len(ll x) {
ll res = 0;
while(x) {
res ++;
x /= 10;
}
return res;
}
void solve() {
ll x, y, z, a, b, c = 2;
cin >> x >> y >> z;
while(len(c) != z) c <<= 1;
a = b = c;
while(len(a) != x) a *= 3;
while(len(b) != y) b *= 2;
cout << a << " " << b << endl;
}
int main() {
#ifdef xrl
freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
FAST_IO;
int t = 1;
cin >> t;
while(t --) solve();
#ifdef xrl
cout << "Time used = " << (double)(clock() * 1.0 / CLOCKS_PER_SEC) << "s";
#endif
return 0;
}
做题反思
难说,只能说教育场总还是有意思的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步