这个做法对吗
查看原帖
这个做法对吗
633466
LiaoYF1楼主2024/11/23 21:42
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define i128 __int128
#define ALL(x) x.begin(),x.end()
#define popcount(x) __builtin_popcountll(x)
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
using namespace std;
const int INF=1e18;
const int N=10005;
const int MOD=1e9+7,MOD2=998244353;
int n,k,ans[N];
struct node{
    int l,r,id;
}a[N];
inline int calc(int x,int y){//a >= x , a mod y =0
    return (x%y==0?x:x+((-x)%y+y)%y);
}
void solve(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i].l>>a[i].r;
        a[i].id=i;
    }
    sort(a+1,a+n+1,[](node x,node y){return x.r-x.l<y.r-y.l;});
    if(a[1].r-a[1].l+1>=k){
        cout<<"Yes\n";
        for(int i=1;i<=n;i++){
            ans[a[i].id]=calc(a[i].l,k);
        }
        for(int i=1;i<=n;i++){
            cout<<ans[i]<<" ";
        }
        cout<<"\n";
        return;
    }
    unordered_set<int> d;
    for(int i=a[1].l;i<=a[1].r;i++){
        for(int j=1;j<=sqrt(i);j++){
            if(i%j==0){
                if(j>=k){
                    d.insert(j);
                }
                if((i/j)>=k){
                    d.insert(i/j);
                }
            }
        }
    }
    for(int i=2;i<=n;i++){
        vector<int> tmp;
        for(auto j:d){
            if(calc(a[i].l,j)>a[i].r){
                tmp.push_back(j);
            }
        }
        for(auto j:tmp){
            d.erase(j);
        }
    }
    if(!d.size()){
        cout<<"No\n";
        return;
    }
    cout<<"Yes\n";
    int x=*d.begin();
    for(int i=1;i<=n;i++){
        ans[a[i].id]=calc(a[i].l,x);
    }
    for(int i=1;i<=n;i++){
        cout<<ans[i]<<" ";
    }
    cout<<"\n";
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int testcase,multitest=1;
    if(multitest)cin>>testcase;
    else testcase=1;
    while(testcase--){
        solve();
    }
    return 0;
}

怎样构造使得 d 的大小最大。

2024/11/23 21:42
加载中...