目前只看懂了A题
A. Forbidden Integer
题意:给点 n, k,x用 1 ~ k 中除了 x 以外的任意数字,且每个数字可以使用任意次,去拼成 n 。
思路:分类讨论:
- 如果除去x以后没有数字了,即可使用的数字为 0 ,则一定为NO 。
- 如果除去x以后有数字:
- 只有一个数字:只要这个数字是n的约数即可。
- 至少两个数字:那么我们只考虑前两个数字,其可能的情况有三种,分别是:“1,2”,“1,3”,“2,3”,前两张情况因为有 1 ,所以直接用 n 个 1 即可,最后一种情况,“2,3”可以组成 的任意数字,但如果 n 为 1 怎么办?因为题目数据范围说了: k ≤ n ,即 k 都已经至少为 3 了,所以 n 不可能为 1
- AC代码:
-
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;int main()
{
{
int n,k,x;
cin >> n >> k >> x;
vector<int> v;
for(int i = 1;i <= min(3,k);i ++)
if(i == x) continue;
else v.push_back(i);
if(v.size() == 0) cout << "NO\n";
else if(v.size() == 1)
{
if(n % v[0] != 0) cout << "NO\n";
else
{
cout << "YES\n";
cout << n / v[0] << "\n";
for(int i = 1;i <= n / v[0];i++)
cout << v[0] << " \n"[i == n / v[0]];
}
}
else
{
if(v[0] == 1)
{
cout << "YES\n";
cout << n << "\n";
for(int i = 1;i <= n;i++) cout << 1 << " \n"[i == n];
}
else
{
if(n % v[0] == 0)
{
cout << "YES\n";
cout << n / v[0] << "\n";
for(int i = 1;i <= n / v[0];i++)
cout << v[0] << " \n"[i == n / v[0]];
}
else
{
n -= 3;
cout << "YES\n";
cout << 1 + n / 2 << "\n";
cout << 3 << " ";
for(int i = 1;i <= n / 2;i++)
cout << v[0] << " \n"[i == n / 2];
}
}
}
}
return 0;
}