1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #include <bits/stdc++.h> using namespace std;
const int N=1e4+5; int T,n,k,chose[N]; struct node { int l,r,id; } a[N];
bool dfs(int x) { if(x>n) { int gcd=chose[1]; for(int i=2;i<=n;i++) gcd=__gcd(gcd,chose[i]); if(gcd>=k) { printf("Yes\n"); for(int i=1;i<=n;i++) printf("%d ",chose[i]); printf("\n"); return true; } return false; } for(int i=a[x].l;i<=a[x].r;i++) { chose[a[x].id]=i; if(dfs(x+1)) return true; } return false; }
int main() { scanf("%d",&T); while(T--) { int mxl=0,mnl=1e9,mxr=0,mnr=1e9; bool subtask=true; int sbtask=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].id=i; if(a[i].r-a[i].l>4) subtask=false; if(a[i].l==a[i].r) sbtask=__gcd(sbtask,a[i].l); mxr=max(mxr,a[i].r),mnr=min(mnr,a[i].r); mxl=max(mxl,a[i].l),mnl=min(mnl,a[i].l); } random_shuffle(a+1,a+1+n);
if(k==1) { printf("Yes\n"); for(int i=1;i<=n;i++) chose[a[i].id]=a[i].l; for(int i=1;i<=n;i++) printf("%d ",chose[i]); printf("\n"); continue ; } if(mxr<=1000) { bool ans=false; for(int i=k;i<=mxr;i++) { bool flag=true; for(int j=1;j<=n;j++) if(((a[j].l-1)/i+1)*i>a[j].r) { flag=false; break ; } if(flag) { printf("Yes\n"); for(int j=1;j<=n;j++) chose[a[j].id]=((a[j].l-1)/i+1)*i; for(int j=1;j<=n;j++) printf("%d ",chose[j]); printf("\n"),ans=true; break ; } } if(!ans) printf("No\n"); continue ; } if(subtask) { if(!dfs(1)) printf("No\n"); continue ; } if(sbtask) { bool ans=false; for(int i=k;i*i<=sbtask;i++) if(sbtask) { bool flag=true; for(int j=1;j<=n;j++) if(((a[j].l-1)/i+1)*i>a[j].r) { flag=false; break ; } if(flag) { printf("Yes\n"); for(int j=1;j<=n;j++) chose[a[j].id]=((a[j].l-1)/i+1)*i; for(int j=1;j<=n;j++) printf("%d ",chose[j]); printf("\n"),ans=true; break ; } } if(!ans) printf("No\n"); continue ; } if(k<=5) { printf("Yes\n"); for(int i=1;i<=n;i++) chose[a[i].id]=a[i].l/5*5+5; for(int i=1;i<=n;i++) printf("%d ",chose[i]); printf("\n"); continue ; } bool ans=false; for(int i=k;i<=mnr;i++) { bool flag=true; for(int j=1;j<=n;j++) if(!((a[j].l-1)/i<a[j].r/i)) { flag=false; break ; } if(flag) { printf("Yes\n"); for(int j=1;j<=n;j++) chose[a[j].id]=((a[j].l-1)/i+1)*i; for(int j=1;j<=n;j++) printf("%d ",chose[j]); printf("\n"),ans=true; break ; } } if(!ans) printf("No\n"); } return 0; }
|