<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;
}