随笔 - 23,  文章 - 0,  评论 - 0,  阅读 - 807

题目概述

原题参考: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;
}

做题反思

难说,只能说教育场总还是有意思的

posted on   山余木  阅读(18)  评论(0编辑  收藏  举报
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示