CF 660 A&B
A. Captain Flint and Crew Recruitment
题目概述
题目中定义了一个nearly prime
的东西,是两个素数的乘积,现在给出一个正整数,要求把它分成4个不同的正整数和的形式,其中至少3个数是nearly prime
,如果可以分成,输出YES
病输出一种可行的结果;如果不可能,输出NO
.
思路
先计算出最小的3个nearly prime
数,分别是6,10,14
然后只要这个输入的数据n
大于30
就可以分成这样4个正整数和的形式,因为要求这4个数必须都不相同,所以对于6+10+14+6=36,6+10+14+10=40,6+10+14+14=44
这3中情况特殊处理,找出一组可行解.
代码实现
/*
* @Author: Shuo Yang
* @Date: 2020-07-30 21:48:14
* @LastEditors: Shuo Yang
* @LastEditTime: 2020-07-30 23:04:03
* @FilePath: /Code-practice-master/CF/660/A.cpp
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
ll buf[N] = {0};
void solve(){
}
int main(int argc, const char** argv) {
int t;
cin>>t;
while(t--){
int n;
cin>>n;
if(n > 30 ){
cout<<"YES"<<endl;
if(n == 36 || n == 44 || n == 40){
if(n == 36){
cout<<"5 6 10 15
";
}else if( n == 44){
cout<<"6 10 13 15
";
}else{
cout<<"6 10 15 9
";
}
}else{
cout<<"6 10 14 "<<(n-30)<<endl;
}
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
刚开始时看漏了一个条件,忘记4个数必须不同这个约束,然后WA
,然后特判把6+10+14+10
算成了50
又WA
了一次,直到第三次才通过Pretests
,不知道最后会不会FST
.
B. Captain Flint and a Long Voyage
题目概述
给出一个(n)位的正整数(x),把它按8421BCD
码的形式展开去掉前导0,得到一个数(k),然后把这个数(k)的后面(n)位删掉,得到一个数(r).现在给出位数(n),计算这个最小的正整数(x),使得展开的数(k)删掉最后面的(n)位后得到的数(r)最大.
解题思路
因为展开的位的表现形式是没有前导0的,所以最后删除的部分应该尽可能的长,是1xxx
的形式,因为原来的每一位都是十进制数,所以要删除的尾部应该是1000
这样的,而前面的部分应该尽可能的大,也就是前面都应该是111
这种位形式,所以最后满足的结果应该是(999cdots888)这样的,其中8
的个数通过(lceil n/4
ceil)计算得到,9
的个数通过(n-lceil n/4
ceil)得到,然后把两部分拼接,就是最终的结果.
代码实现
/*
* @Author: Shuo Yang
* @Date: 2020-07-30 21:46:06
* @LastEditors: Shuo Yang
* @LastEditTime: 2020-07-30 23:42:26
* @FilePath: /Code-practice-master/CF/660/B.cpp
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
ll buf[N] = {0};
void solve(){
}
int main(int argc, const char** argv) {
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int x = (n+3)/4;
string ans = string(n-x,'9')+string(x,'8');
cout<<ans<<endl;
}
return 0;
}