首页 > 其他分享 >杂题选做1

杂题选做1

时间:2024-11-01 11:42:04浏览次数:3  
标签:ch nn int bmod 号牌 杂题 sum

杂题选做1

[ARC112F] Die Siedler

注意到如果存在某一个 \(j\) 满足这种牌的数量大于等于 \(2j\) ,那么一定会兑换为 \(j \bmod n +1\) 的牌。所以我们考虑这个过程的逆过程,就是将一张牌 \(j\) 换成 \((j-1)!2^{j-1}\) 张 \(1\) 号牌,最终全部的牌都被转化为了 \(1\) 号牌,但是结果并不会改变。记录 \(P=\sum_{i=1}^n c_i 2^{i-1} (i-1)!\) ,表示初始局面 \(1\) 号牌的数量。同理记录 \(b_k=\sum_{i=1}^n a_{k,i}2^{i-1}(i-1)!\) 表示牌堆 \(k\) 经过转化后的 \(1\) 号牌数量。

考虑一组选取牌堆的方案 \(x_1,x_2,\dots,x_n (x_i \geq 0)\) ,最终的 \(1\) 号牌数量为 \(Q=P+\sum_{i=1}^n x_ib_i\) 。这个值可能很大,但是考虑我们将 \(1\) 号牌换成 \(2\) 号牌 ,一直换直到又合成了一张 \(1\) 号牌,中间减少了 \(2^nn!\) 张牌,但是又获得了一张牌。所以 \(Q\) 和 \(Q \bmod (2^nn!-1)\) 是等价的。定义 \(f(Q)\) 表示初始拥有 \(Q(Q <2^nn!)\) 张 \(1\) 号牌,最终会剩下多少牌,具体计算只需要 \(O(n)\) 模拟一下即可。

考虑什么样的 \(Q\) 是可以被表示出来的?那么根据

\[Q \equiv P+\sum_{i=1}^nx_ib_i (\bmod 2^nn!-1) \]

得到

\[Q-P \bmod (2^nn!-1)=\sum_{i=1}^n x_ib_i - y\times (2^nn!-1) \]

记录 \(d=\gcd(b_1,b_2,\dots,b_n,2^nn!-1)\) ,最终一定需要满足 \(Q-P\bmod (2^nn!-1) =kd\) ,因为 \(d\) 是 \(2^nn!-1\) 的因数,所以这又是 \(Q=kd+P\bmod d\) 。

考虑一个比较有意思的事情,因为有效的 \(Q<2^nn!-1\) 的缘故,\(kd<2^nn!-1\) ,那么 \(k \leq \frac{2^nn!-1}{d}\) ,当 \(d\) 比较大的时候有比较快的速度。\(O(n\frac{2^nn-1}{d})\) 。

那么 \(d\) 比较小的时候怎么办?我们考虑随意填写卡牌,只需要最终全部的卡牌转化为 \(1\) 号牌后,模 \(d\) 的余数为 \(P \bmod d\) 即可,这个过程可以使用同余最短路处理。\(O(nd)\) 。

这个容易想到根号分治。

事实上,在 \(\sqrt{2^nn!-1}\) 以内的 \(d\) 最大为 \(1615037\) 。显而易见的第二种做法符合了时间复杂度。考虑第一种做法的时间最大消耗是啥?\(O(n\frac{2^nn!-1}{1615037})\) 吗?并不是的。第一个大于 \(\sqrt{2^nn!-1}\) 的因数就是 \(e=\frac{\sqrt{2^nn!-1}}{1615037}\) ,带入第一种做法得到时间最劣为 \(O(1615037n)\) ,可以通过。

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int buf[30];
inline void print(int x,char ch=' '){
	if(x<0) putchar('-'),x=-x;
	int tot=0;
	do{
		buf[++tot]=x%10;
		x/=10;
	}while(x);
	for(int i=tot;i;i--) putchar(buf[i]+'0');
	putchar(ch);
}
const int N=20,inf=1e18;
int n,m,f[N];
int P;

int func(int x){
	int ans=0;
	for(int i=1;i<=n;i++){
		ans+=x%(2*i);
		x/=(2*i);
	}
	return ans;
}
int solve1(int d){
	int ans=inf;
	for(int i=P%d;i<f[n];i+=d)
		if(i) ans=min(ans,func(i));
	return ans;
}

int dis[1615037];
int solve2(int d){
	memset(dis,-1,sizeof(dis));
	queue<int> q;
	for(int i=0;i<n;i++)
		dis[f[i]%d]=1,q.push(f[i]%d);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<n;i++){
			int nxt=(u+f[i])%d;
			if(dis[nxt]==-1)
				dis[nxt]=dis[u]+1,q.push(nxt);
		}
	}
	return dis[P%d];
}
signed main(){
	n=read(),m=read();
	f[0]=1;
	for(int i=1;i<=n;i++)
		f[i]=f[i-1]*2*i;
	for(int i=1;i<=n;i++){
		int x=read();
		P+=x*f[i-1];
	}

	int d=f[n]-1;
	for(int i=1;i<=m;i++){
		int sum=0;
		for(int j=1;j<=n;j++){
			int x=read();
			sum+=x*f[j-1];
		}
		d=__gcd(d,sum);
	}

	if(d<=1615037) cout<<solve2(d);
	else cout<<solve1(d);
	return 0;
}
asd

标签:ch,nn,int,bmod,号牌,杂题,sum
From: https://www.cnblogs.com/dan-da-dan/p/18519864

相关文章

  • 数据结构杂题乱记
    由于是杂题乱记所以题目大多数不会太难。目录P2572[SCOI2010]序列操作题目内容思路代码P2572[SCOI2010]序列操作题目内容给你一个\(01\)序列,支持\(5\)种操作:0lr区间赋值为\(0\);1lr区间赋值为\(1\);2lr区间取反,即\(0\)变\(1\)、\(1\)变\(0\);3lr询......
  • 杂题随笔 10.31 两道LIS相关的题
    https://www.luogu.com.cn/problem/AT_abc354_f题意:给定一个序列a,求出所有的i使得任意一个a的最长子序列包含i。解法:我们先求这个序列的LIS的长度maxx,然后再去正着求一遍最长上升子序列和反着求一遍最长下降子序列即可,如果拼起来等于maxx那么说明i这个点是满足要求的点。注意细......
  • Day65 小贪心 & 自选杂题
    哎怎么必可公益赛被爆破了,怎么lifan还加了几道我们的训练题目作为补偿。CF不知道死了多久了,一上午都没有打成duel!今天上午精神状态明显好了很多,可能和咖啡有点关系吧。按照时间顺序写题吧。AT_arc070_b可以进行撤销背包,也可以算前后缀背包,都是记录方案数。不难的。AT_a......
  • 强连通分量学习笔记+杂题
    图论系列:前言:僕は明快さ故にアイロニー優柔不断なフォローミー後悔後悔夜の果て相关题单:戳我一.强连通分量相关定义基本摘自oiwiki,相关定义还是需要了解。(实际就是搬了个oiwiki)强连通分量主要在研究有向图可达性,针对的图类型为有向弱联通图。1.强连通定义强连通:对......
  • 杂题随笔 2024.10.25 两道图论
    最近在写abc375这场,最后的F和G是两道很典的图论题。https://atcoder.jp/contests/abc375/tasks/abc375_f题意:大致就是说给你一张图,有两种操作:第一种操作是把第i条边删掉,第二种操作是询问u,v两点的最短路。解法:这种题目印象里好像是考过几次了,把在线询问的顺序转变,倒着做,把减边......
  • 2024.10.23-25 杂题
    2024.10.23-25杂题P7323[WC2021]括号路径如果存在\((a,b,w)\),\((c,b,w)\)。那么\((a,c)\)就是一条合法路径。所以把\(a,c\)放入一个集合。然后合并新的的时候把\(w\)一样的合并了就行。最后统计每个"块"的数量,答案就是\(\sum_{i=1}^{n}C_{cnt_i}^{2}\)复杂度\(O(......
  • 吉米多维奇杂题选解——数列极限
    吉米多维奇杂题选解——数列极限一、用定义证明数列极限等式T1.求证:\(\lim\limits_{n\to\infty}\dfrac{n^\alpha}{c^n}=0,(a>0,c>1)\)证明:令\(k=\left\lfloor\alpha\right\rfloor+1\),则\(\dfrac{n^\alpha}{c^n}<\dfrac{n^k}{c^n}=\left(\dfrac{n}{(\sqrt[k]{c})^n}\......
  • 浅谈哈希及一类应用杂题
    浅谈哈希及一类应用杂题关于哈希的一些另类想法PS:与后文实际应用无关哈希的目的本质就是比较两个无法直接比较是否相同的一些东西,通过赋值来使其获得比较大小的能力,然后就想能不能搞一个随手就能整出来还不容易被卡常数比如之前好多题卡\(131\)什么的。如果我的数是纯随机的......
  • 2024.10.21 杂题
    2024.10.21杂题P11217【MX-S4-T1】「yyOIR2」youyou的垃圾桶\(O(n\logn)\)线段树二分不会,想写\(O(q\log^2n)\)的二分,但是htdlz说常数大可能过不去。所以我选择写树状数组实现的\(O(q\log^2n)\)做法然后跑的飞快比线段树二分还快直接过了(doge)记录前缀和\(s[i......
  • 2024.10.20 杂题
    P11208『STA-R8』轮回疯狂只执行操作一就是逆序对的个数,统计对于每一个\(a_i\)的逆序对个数为\(b_i\),然后模拟执行删除操作,如果删除操作比换位操作更优就更新答案。复杂度\(O(n\logn)\)record将最小的删除可以等价成往里加最大的数,倒着模拟即可。至于操作一,每次往数......