C2. k-LCM (hard version)
题目
题目大意
给你一个数n,让你将其划分为k个数,并且这k个数中最小公倍数不得超过n/2。
思路
其实这道题目和简单版差别不大,简单版本中,如果n为奇数,那么你就输出n/2,n/2,1。那么在难版本中呢,k>3的部分输出1,剩下输出n/2,n/2,1,当然这里需要判断输出了k-3之后n为奇还为偶,在简单版本中,n为偶数时是不是先判断下,能不能被4整除如果能被4整除,那么就输出n/2,n/4,n/4,如果不能那就输出n/2-1,n/2-1,2,那么在这个基础之上先输出k-3个1,然后再判断能不能被4整除。
通过代码
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
using namespace std;
#define ll long long
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define sdf(n) scanf("%lf",&n)
#define pdf(n) printf("%.lf",n)
#define pE printf("\n")
#define ull unsigned long long
#define pb push_back
#define pre(n) for(ll i=1;i<=n;i++)
#define rep(n) for(ll i=n;i>=1;i--)
#define pi pair<ll,ll>
#define fi first
#define se second
int main()
{
ll t,n,k,i;
sl(t);
while(t--){
sl(n),sl(k);
if(n%k==0){
for(i=0;i<k;i++)cout<<n/k<<' ';
cout<<endl;
continue;
}
if(k==3){
if(n&1){
cout<<n/2<<' '<<n/2<<' '<<'1'<<endl;
}
else {
if(n/2%2)cout<<n/2-1<<' '<<n/2-1<<' '<<'2'<<endl;
else cout<<n/2<<' '<<n/4<<' '<<n/4<<endl;
}
}
else{
for(i=0;i<k-3;i++){
cout<<'1'<<' ';
}
n-=(k-3);
if(n&1){
cout<<n/2<<' '<<n/2<<' '<<'1'<<endl;
}
else {
if(n/2%2)cout<<n/2-1<<' '<<n/2-1<<' '<<'2'<<endl;
else cout<<n/2<<' '<<n/4<<' '<<n/4<<endl;
}
}
}
return 0;
}