A
给出 k 个奇偶性相同的正整数,使得其和等于 n。
例如 n = 10,k = 3,答案可以为 [4 2 4]。
思路
当n为奇数时,必有奇数个奇数组成。然后分情况讨论
代码
#include<iostream>
#include<algorithm>
using namespace std;
int T,n,k;
int a[105];
int main(){
cin>>T;
while(T--){
cin>>n>>k;
if(n%2==1&&k%2==0){
//n为奇数 k为偶数
cout<<"NO"<<endl;
continue;
}
if(k>n){
cout<<"NO"<<endl;
continue;
}
//1、n为奇数 k为奇数
if(n%2==1&&k%2==1){
for(int i=0;i<k;i++){
if(i==k-1) a[i]=n;
else{
a[i]=1;
n--;
}
}
}
//2、n为偶数 k为偶数
if(n%2==0&&k%2==0){
for(int i=0;i<k;i++){
if(i==k-1) a[i]=n;
else{
a[i]=1;
n--;
}
}
}
//3、n为偶数 k为奇数 需要k个偶数
if(n%2==0&&k%2==1){
if(n<2*k){
cout<<"NO"<<endl;
continue;
}
for(int i=0;i<k;i++){
if(i==k-1) a[i]=n;
else{
a[i]=2;
n-=2;
}
}
}
cout<<"YES"<<endl;
for(int i=0;i<k;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}
B
给出无法被 n 整除的第 k 大的正整数。
例如 n = 3,k = 7,则前 7 个无法被 n 整除的正整数为 [1 2 4 5 7 8 10],答案为 10。
思路
1——n-1无法被整除,n+1——2n-1无法被整除…统计k中属于第几段即可。
注意需要判断k能被n-1整除的情况
代码
#include<iostream>
#include<algorithm>
using namespace std;
int T,n,k,ans;
int main(){
cin>>T;
while(T--){
cin>>n>>k;
ans=k/(n-1)*n+k%(n-1);
if(k%(n-1)==0) ans--;
cout<<ans<<endl;
}
}