計蒜客比賽 - 2018 計蒜之道 初賽 第五場 A B 題解

<A> 鏈接:https://nanti.jisuanke.com/t/27292

思路:

由於所有的箱子可以看成喲一個大的立方體,所有前後左右上這五個朝向各去掉一層以後,仍爲立方體,那麼你現在知道的是剩下多少的箱子,換句話說,已知條件是,被在五個朝向各去掉一層後的立方體的體積,那麼要求原來立方體最大最小的體積分別是多少應該怎麼操作呢,我的思路是,挨個枚舉出來就好了,把原來的體積 V 拆成 i * j * k,即立方體長寬高,那麼就要考慮除底面外,各個面摘除1層的手段了,上面去掉一層,那新的高就是原來的高減一,前後左右各去掉一層之後,新的長和寬都變爲原來的值減2了,所以就看枚舉出來的長 i,  寬 j , 高 k , 取多少能讓體積最大或最小就好了。

本人AC代碼:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int Inf = 1e9 + 7;

int main() {
    int cas;
    cin >> cas;
    int p;
    int r1, r2;
    while(cas--) {
        cin >> p;
        int r1 = Inf;
        int r2 = 0;
        for(int i = 1; i <= 1000; i++) {
            if(p % i == 0) {
                for(int j = 1; j <= 1000; j++) {
                    if(p % (i * j) == 0) {
                        int k = p / (i * j);
                        int tmp = (k + 1) * (i + 2) * (j + 2);
                        r1 = min(r1, tmp); r2 = max(r2, tmp);
                        tmp = (k + 2) * (i + 1) * (j + 2);
                        r1 = min(r1, tmp); r2 = max(r2, tmp);
                        tmp = (k + 2) * (i + 2) * (j + 1);
                        r1 = min(r1, tmp); r2 = max(r2, tmp);
                    }
                }
            }
        }
        r1 -= p;
        r2 -= p;
        cout << r1 << " " << r2 <<endl;
    }

}


<B> 鏈接:https://nanti.jisuanke.com/t/27289

思路:

這題,大暴力就OK,n方枚舉一下滿足條件的即可,對每次枚舉出來的兩個數,進行模十除十操作就行,如果是3位數那就取三次模10的值相乘,兩位數就取前兩次,一位數就取第一次即可,然後再取gcd看滿足題意與否。給的區間是1 ~ 1000,1000能取到,爲什麼只最高只需要看三位數就行呢,因爲題意要求取gcd的兩個數均不能爲0,f(1000) = 1*0*0*0 = 0,顯然不滿足題意,故不必考慮。

本人AC代碼:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = 998244353;

int gcd(int a, int b) {
    return (a == 0) ? b : gcd(b % a, a);
}

int main() {
    int n;
    ll k;
    cin >> n >> k;
    int cnt = 0;
    int p1, p2, s, t;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            s = i;
            t = j;

            int a = s % 10;
            s /= 10;
            int b = s % 10;
            s /= 10;
            int c = s % 10;

            int A = t % 10;
            t /= 10;
            int B = t % 10;
            t /= 10;
            int C = t % 10;

            if(i >= 100) p1 = a * b * c;
            else if(i >= 10 && i < 100) p1 = a * b;
            else p1 = a;
            if(j >= 100) p2 = A * B * C;
            else if(j >= 10 && j < 100) p2 = A * B;
            else p2 = A;
            if(p1 * p2 > 0 && gcd(p1, p2) <= k && gcd(p1, p2) > 0) {
                cnt++;
                if(cnt >= mod) cnt %= mod;
            }
        }
    }
    cout << cnt << endl;
}

發佈了84 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章