目錄
- 題目概述
- 思路想法
- 參考程式碼
- 做題反思
題目概述
原題參考: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;
}
做題反思
難說,只能說教育場總還是有意思的