CF1594F-Ideal Farm【构造】
正題
題目鏈接:https://www.luogu.com.cn/problem/CF1594F
題目大意
給出n,s,kn,s,kn,s,k,求是否所有的長度為nnn且和為sss的正整數序列都有一段和為kkk的區間。
1≤T≤105,1≤n,s,k≤10181\leq T\leq 10^5,1\leq n,s,k\leq 10^{18}1≤T≤105,1≤n,s,k≤1018
解題思路
可以考慮構造一個序列使得沒有和為kkk的區間。
要求使得沒有兩個前綴和差值為kkk,構造時顯然前面的越小越好,因為如果前面的增大給后面的減小那么還不如直接讓前面的減小,當我們在前綴和中填入1~k?11\sim k-11~k?1之后我們下一個由于(0~k?1)+k(0\sim k-1)+k(0~k?1)+k都給封鎖住了所以我們只能填2k2k2k,然后可以繼續往后填2k~3k?12k\sim 3k-12k~3k?1,發現每隔kkk個就要加k+1k+1k+1。
也就是我們構造的序列是形如:1,1,1,1,...k+1,1,1,1,...k+1,1,1,11,1,1,1,...k+1,1,1,1,...k+1,1,1,11,1,1,1,...k+1,1,1,1,...k+1,1,1,1形式的,計算出前nnn個的最小和就好了。
然后交上去發現WA了,后來想了想當n<kn<kn<k時由于沒有填上關鍵格所以需要特殊考慮,如果s=ks=ks=k時顯然是無解的,否則n<kn<kn<k時填n?1n-1n?1個111然后填s?n+1s-n+1s?n+1即可。
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll T,s,n,k; signed main() {scanf("%lld",&T);while(T--){scanf("%lld%lld%lld",&s,&n,&k);if(n<k){if(s==k)puts("YES");else puts("NO");continue;}ll w=n/k*2ll*k+n%k;if(s<w)puts("YES");else puts("NO");}return 0; }總結
以上是生活随笔為你收集整理的CF1594F-Ideal Farm【构造】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四字qq昵称 甜美可爱的四字网名
- 下一篇: 2021牛客OI赛前集训营-交替【生成函