题意:
要你构造一串数字,使得各自的不一样,其中
的值域是
构造题要找出条件,并找出边缘特解
首先,对于思维题要仔细观察他们的样例
观察第一个sample可知,要使他们的gcd不一样,考虑把他们的gcd都变成1~n的排列
那么我们就要找出在
中的其中一个倍数即可
我居然是卡在了这里,小学算术都没学会是真的没蚌住
我本来想构造在值域内的第一个倍数,(l+1)/i*i,然后去判它和r的大小,wa了
正解是构造最后一个倍数,(r/i)*i,r/i是往下取整的,因此不用担心他会超过r,所有只需要判它是不是大于l即可
Code:
const int mxn=1e5+10;
vector<int> ans;
void solve(){
ans.clear();
int n=rd(),l=rd(),r=rd();
rep(i,1,n){
if(i*(r/i)>=l){
ans.push_back((r/i)*i);
}else{
puts("NO");
return;
}
}
puts("YES");
rep(i,0,ans.size()-1) printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
}
总结:
1.得到一个模型:判定一个数的倍数在不在一个值域内,我们取它最后一个倍数,因为除法是向下取整,这样写比较好处理