P11229 [CSP-J 2024] 小木棍 题解
闲话
本蒟蒻第一篇黄题题解(话说今年J组T3真的太水了)
考完的我原本自信满满,可许多大佬都说T3爆了...... 结果本代码似乎确凿是AC的(偷乐)
鄙人才疏学浅,仅供参考
题目大意
小 S 有 n 根长度相等的小木棍,用小木棍拼每种数字的方法如下图所示。
现在小 S 希望拼出一个正整数,满足如下条件:
拼出这个数恰好使用 n 根小木棍; 拼出的数没有前导0;且这个数尽可能小。小 S 想知道这个数是多少,如果不存在正整数满足以上条件,输出 −1。
规律
考场上蒟蒻的我本打算放弃,并开始了愉快的打表......
但众所周知,本题的特判+打表就有高达60pts,而打表也存在很高的计算量,于是阴差阳错之下,本蒟蒻发现了此题的规律(代码中不细述):
- 当 n 是 7 的倍数时 输出(n / 7)个 8
- 当 n % 7 为 1 时 输出 ‘1’‘0’(n / 7 - 1)个 8
- 当 n % 7 为 2 时 输出 ‘1’(n / 7)个 8
- 当 n % 7 为 3 时 输出 ‘2’‘0’‘0’(n / 7 - 2)个 8
- 当 n % 7 为 4 时 输出 ‘2’‘0’(n / 7 - 1)个 8
- 当 n % 7 为 5 时 输出 ‘2’(n / 7)个 8
- 当 n % 7 为 6 时 输出 ‘6’(n / 7)个 8
PS: 毕竟输出的是个数,别手欠在每位数字后输出空格
于是:
上代码!
#include<bits/stdc++.h>//懒人头文件
using namespace std;
int n, t;
int main(){
cin >> t;
while(t--){
cin >> n;
if(n == 1) cout << -1 << endl;//特判无解情况
else if(n == 2) cout << 1 << endl;
else if(n == 3) cout << 7 << endl;
else if(n == 4) cout << 4 << endl;
else if(n == 10) cout << 22 << endl;
//特判不符合以下规律的
else if(n % 7 == 0){//开始判除以7的余数
int da = n / 7;//致敬dada
while(da--) cout << 8;
puts("");//别忘了换行
}else if(n % 7 == 1){
cout << 10;
int da = n / 7 - 1;
while(da--) cout << 8;
puts("");
}else if(n % 7 == 2){
cout << 1;
int da = n / 7;
while(da--) cout << 8;
puts("");
}else if(n % 7 == 3){
cout << 200;
int da = n / 7 - 2;
while(da--) cout << 8;
puts("");
}else if(n % 7 == 4){
cout << 20;
int da = n / 7 - 1;
while(da--) cout << 8;
puts("");
}else if(n % 7 == 5){
cout << 2;
int da = n / 7;
while(da--) cout << 8;
puts("");
}else if(n % 7 == 6){
cout << 6;
int da = n / 7;
while(da--) cout << 8;
puts("");
}
}
return 0;//完结撒花
}
这么一道数论的题放在T3多少有点水了(小声蛐蛐)
欢迎大佬批判
也是水到2000字符了嘻嘻