首页 > 其他分享 >Atcoder Grand Contest 057 D - Sum Avoidance

Atcoder Grand Contest 057 D - Sum Avoidance

时间:2023-07-20 09:01:00浏览次数:45  
标签:Atcoder Contest int ll mid 最小 cdots Avoidance bmod

先来找些性质:

  • \(A\) 中最小的元素 \(M\) 肯定是最小的不是 \(S\) 的因子的数,由于 \(\text{lcm}(1,2,3,\cdots,43)>10^{18}\),所以 \(M\le 43\)。
  • 对于每个 \(0\le i<M\),\(\bmod M=i\) 的数被选择的部分必然是一段后缀,因为如果你选择了 \(M\) 选择了某个 \(\bmod M=i\) 的数 \(v\),那么再选 \(v+M\) 也是不会有影响的。
  • 考虑扩展得到最优解对应的 \(A\) 的过程,必然是我从 \(A=\{M,2M,3M,\cdots,\lfloor\dfrac{S-1}{M}\rfloor·M\}\) 开始,每次找到最小的满足”加入这个数以后得不到 \(S\)“的数 \(v\),将 \(v,v+M,v+2M,\cdots\) 加入 \(A\)。

现在考虑如何求解答案。由于我们暴力扩展最多只会扩展 \(M-1\) 轮,所以我们可以暴力求出每次要加入的数 \(\bmod M\) 的值,这一脸同余最短路的样子,具体来说我们实时维护个 \(mn_i\) 表示 \(\bmod M=i\) 的数当中最小的能够表示为 \(A\) 中数的线性组合的数,这样我们可以在 \(O(M)\) 的时间内算出 \(\bmod M=i\) 的数当中最小的满足加入这个数之后 \(S\) 不能被表示出来的数。这样我们求出了每个 \(\bmod M\) 的等价类最小的在 \(A\) 中的数,直接二分求第 \(k\) 小即可。

时间复杂度 \(O(TM^3)\)。

const ll INF=0x3f3f3f3f3f3f3f3fll;
ll S,K,mn[45],val[45];int m;
ll calc(ll p){
	ll sum=0;
	for(int i=0;i<m;i++)if(val[i]<=p)sum+=(p-val[i])/m+1;
	return sum;
}
void solve(){
	scanf("%lld%lld",&S,&K);for(int i=2;;i++)if(S%i){m=i;break;}
	memset(mn,63,sizeof(mn));memset(val,63,sizeof(val));mn[0]=0;val[0]=m;
	while(1){
		int rem=0;ll mnv=INF;
		for(int i=1;i<=m-1;i++){
			if(val[i]!=INF)continue;ll mx=i;
			for(int j=1;j<=m-1;j++){
				int nd_rem=(S-j*i%m+m)%m;
				if(mn[nd_rem]!=INF)chkmax(mx,(S-mn[nd_rem]+j)/j);
			}
			while(mx%m!=i)++mx;
			if(mx<mnv)mnv=mx,rem=i;
		}if(mnv==INF)break;val[rem]=mnv;
		for(int i=1;i<=m-1;i++){
			if(1ll*i*mnv>S)break;
			for(int j=1;j<=m-1;j++){
				int nd_rem=(j-(mnv%m)*i%m+m)%m;
				chkmin(mn[j],mn[nd_rem]+i*mnv);
			}
		}
	}
	if(calc(S-1)<K)return puts("-1"),void();
	else{
		ll L=1,R=S-1,P=0;
		while(L<=R){
			ll mid=L+R>>1;
			if(calc(mid)>=K)P=mid,R=mid-1;
			else L=mid+1;
		}printf("%lld\n",P);
	}
}
int main(){
	int qu;scanf("%d",&qu);while(qu--)solve();
	return 0;
}

标签:Atcoder,Contest,int,ll,mid,最小,cdots,Avoidance,bmod
From: https://www.cnblogs.com/tzcwk/p/agc057D.html

相关文章

  • AtCoder Grand Contest 049 E Increment Decrement
    洛谷传送门AtCoder传送门好题。同时考查了slopetrick和选手的计数能力,不愧是AGCE。先考虑问题的第一部分。你现在有一个初始全为\(0\)的序列\(b\)。你每次可以给\(b\)单点\(\pm1\),代价为\(1\),或区间\(\pm1\),代价为\(m\)。求把\(b\)变成给定序列\(a\)的......
  • AtCoder Beginner Contest 310
    A-OrderSomethingElse#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn,p,q;cin>>n>>p>>q;......
  • 【2023.07.14】Atcoder:past201912 - 第一回 アルゴリズム実技検定(div4+区域赛难度)过题
    G-Division解法一:位运算+状压枚举(赛时思路)范围显然,可以跑\(2^n\)的算法,考虑位运算状态压缩。以\(\mathcalO(2^n\cdot2^n)\)的复杂度分别枚举位于第一组、第二组中的人,随后计算每一种分组的快乐值,代码较长,赛时敲了半个小时,不过好在一发过了。总结:其实代码里面的剪枝完......
  • freee Programming Contest 2023(AtCoder Beginner Contest 310)
    Preface打的就是依托答辩,当时看一眼D感觉是个爆搜不想写就先跳了去想F,结果傻逼了没想出来最后30min了赶紧溜回去把D爆搜写了,但是已经罚时爆炸了,其实如果正常正序做的话排名会挺稳的后面一问包大爷发现F是个傻逼题,只能说计数水平实在是低下A-OrderSomethingElse签到题#i......
  • SMU Summer 2023 Contest Round 4
    SMUSummer2023ContestRound4A-TelephoneNumber思路:满足有8,且8后有大于等于11个数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<char,int>PCI;type......
  • SMU Summer 2023 Contest Round 4
    SMUSummer2023ContestRound4A.TelephoneNumber满足第一个8后面存在10个字符即可#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongusingnamespacestd;intn,m;voidsolve(){cin>>n;strings;cin>>s;......
  • AtCoder Beginner Contest 310
    PeacefulTeams\(n\)个运动员,要分成\(t\)个队伍,一共有\(m\)对人不能放在一支队伍里,求方案数,每支队伍至少需要有一个人\(1\leqt\leqn\leq10\)题解:DFS搜索通过数据范围考虑爆搜我们考虑枚举的顺序\(O(n!)\)我们对每个人\(c\)枚举将其加到当前的\(d\)支队伍中新开一......
  • AtCoder Regular Contest 092 E Both Sides Merger
    洛谷传送门AtCoder传送门Keyobservation:每个元素的下标奇偶性不改变。于是讨论最后一个数是下标为奇数还是偶数加起来的数。将下标奇偶性相同的元素分开考虑。对于下标奇偶性相同的元素,不难发现答案的上界是所有\(>0\)的元素之和(没有\(>0\)的元素时选一个最大的),并且一......
  • freee Programming Contest 2023(AtCoder Beginner Contest 310)
    freeeProgrammingContest2023(AtCoderBeginnerContest310)-AtCoderA-OrderSomethingElse(atcoder.jp)题意是在买一道菜的情况下可以将原为\(P\)元的饮料优惠到\(Q\)元,否则就按原价买#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signed......
  • AtCoder Beginner Contest 310
    (AtCoderBeginnerContest310) A-OrderSomethingElse思路:比较下打折和不打折的情况#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;c......