gcd思維_cfECR107_B. GCD Length

山余木發表於2024-03-09

目錄
  • 題目概述
  • 思路想法
  • 參考程式碼
  • 做題反思

題目概述

原題參考: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 = 128
32=????,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;
}

做題反思

難說,只能說教育場總還是有意思的