首页 > 其他分享 >2.16 闲话 & solution『漆黑的夜中透出了一点点微光/早就应该习惯/忽明忽暗酒阑人散』

2.16 闲话 & solution『漆黑的夜中透出了一点点微光/早就应该习惯/忽明忽暗酒阑人散』

时间:2024-02-16 22:11:37浏览次数:22  
标签:log int res 酒阑人散 solution text 2.16 dp equiv

为啥只有我和CuFeO4【数据删除】,别人都没【数据删除】,血亏,下次绝对不【数据删除】了

明天有CF,希望能打

在写\(\text{NTT}\)惹,但是没有达成写4题呜呜

明天有模拟赛


唔,首先是朴素 \(dp\) 骗分,设 \(dp_{i,j}\) 表示已经取到了 \(i\) 个,其中取模后结果为 \(j\) 的方案数,容易有转移

\[dp_{i+j,z}=\sum_{x*y\equiv z\pmod{p}}dp_{i,y}*dp_{j,x} \]

复杂度似乎是明显的\(O(nm^2)\),能有\(10\text{pts}\)似乎不错了

然后发现可以倍增优化,转移方程变为

\[dp_{2\times i,z}=\sum_{x*y\equiv z\pmod{p}}dp_{i,y}*dp_{i,x} \]

复杂度\(O(m^2 \log n)\)似乎用处不大啊

但是这是\(\text{NTT}\)题单的题啊,所以必然要用\(\text{NTT}\)来加速的

上面那依托东西可以看做这个

\[c_{z}=\sum_{x*y\equiv z\pmod p}a_{x}b_{y} \]

如果能转化成下面的式子就可以 \(\text{NTT}\) 了嗯哼

\[c_{z}=\sum_{x*y\equiv z\pmod p}a_{x}b_{y} \]

但是我不太会,看了题解说可以转化成 \(\log\) 很奇怪

\[c_{\log_gz}=\sum_{\log _gx+\log _gy\equiv log_gz\pmod p}a_{\log_gx}+b_{\log_gy} \]

然后不就随便搞了呜

『你应该忘记了吧/天气晴朗/心里却潮湿的盛夏』
const int mod=1004535809;
int n,m,X,S,tot,cnt,rev[N],g,gg,a[N],b[N],res[N],f[N],top,fact[N]; 
map<int,int>mp; 
inline int qpow(int x,int y,int p){
	int res=1;
	for(;y;y>>=1,x=x*x%p)
		if(y&1)res=res*x%p;
	return res; 
}
inline int Get(int x){
	top=0; 
	int rem=x-1,p=rem; 
	for(int i=2;i*i<=x;i++)
		if(!(rem%i)){
			fact[++top]=i;
			while(!(rem%i))rem/=i; 
		}
	if(rem>1) fact[++top]=rem; 
	for(int flag=1,i=2;i<=p;i++,flag=1){
		for(int j=1;j<=top&&flag;j++)
			if(qpow(i,p/fact[j],x)==1) flag=0;
		if(flag) return i; 
	}
	return -1; 
}
inline void NTT(int *p,int opt){
	for(int i=0;i<tot;i++) if(i<rev[i]) swap(p[i],p[rev[i]]);
	for(int i=1;i<tot;i<<=1){
		int rt=qpow(opt==1?g:gg,(mod-1)/(i<<1),mod);
		for(int j=0;j<tot;j+=(i<<1)){
			int w=1;
			for(int k=j;k<j+i;k++,w=w*rt%mod){
				int x=p[k],y=w*p[k+i]%mod;
				p[k]=(x+y)%mod,p[k+i]=(x-y+mod)%mod; 
			}
		}
	}
	if(opt==-1){
		int inv=qpow(tot,mod-2,mod);
		for(int i=0;i<tot;i++) a[i]=a[i]*inv%mod; 
	}
}
inline void mul(int *A,int *B,int *C){
	for(int i=0;i<tot;i++) 
        a[i]=A[i],b[i]=B[i];
	NTT(a,1),NTT(b,1);
	for(int i=0;i<tot;i++) 
        a[i]=a[i]*b[i]%mod;
	NTT(a,-1); 
	for(int i=0;i<m-1;i++) 
        a[i]=(a[i]+a[i+m-1])%mod,
        a[i+m-1]=0;
	for(int i=0;i<tot;i++) 
        C[i]=a[i]; 
}
signed main(){
	FastI>>n>>m>>X>>S;
	g=Get(m),gg=qpow(g,m-2,m); 
	for(int tmp=1,i=0;i<m-1;i++,tmp=tmp*g%m) 
        mp[tmp]=i; 
	for(int x,i=1;i<=S;i++){
		FastI>>x; 
		if(x) 
            f[mp[x]]++; 
	}
	res[mp[1]]=1; 
	for(tot=1;tot<=2*m;tot<<=1) 
        cnt++;
    cnt--;
	for(int i=0;i<tot;i++) 
        rev[i]=(rev[i>>1]>>1)|((i&1)<<cnt);
	g=Get(mod),gg=qpow(g,mod-2,mod); 
	while(n){
		if(n&1) 
            mul(res,f,res); 
		mul(f,f,f); 
		n>>=1; 
	}
    FastO<<res[mp[X]];
}

然后是最短母串,一道AC自动机+状压dp的好题,但是因为越界了所以调了好久导致鲜花没时间写了,血亏

image

标签:log,int,res,酒阑人散,solution,text,2.16,dp,equiv
From: https://www.cnblogs.com/Vsinger-LuoTianYi/p/18017557

相关文章

  • Solution Set【2024.2.16】
    A.寄(post)对于点对贡献问题考虑在最近公共祖先处计算答案,称给定的\(m\)个点为关键点,选择的\(k\)个点为选择点。既然我们已经要求了对于每一对关键点和选择点均在其最近公共祖先处计算答案,那么这也就意味着,存在某些节点,其子树中的关键点/选择点不会与其子树内的选择点/关......
  • 闲话2.16
    刚写了个唐氏鞋油,感觉自己跟唐一样......
  • 2024.2.16 そんな凡庸を探して、探している
    Namid[A]me好听呢。可惜了。今天DP专题感觉laofu选的题有点经典,导致我有一半时间在摸鱼,不过还是写了点题的。怎么西工大附中有糖醋茄子这种神秘菜啊。ICPC2020MacauBBoringProblem其实不一定懂完了,试着说一说。显然询问没什么用,问题本质是要求解一个AC自动机上游......
  • 2.16
        ......
  • 2024.2.16模拟赛总结
    前言:这次不太好,rank6,挂了108.5分,不挂就随便rank1了T1直接状压,设\(f[S][i][j][0/1]\)表示当前选的集合为S,最后两个分别为i,j的方案数和最优解,然后直接跑有亿点细节1:要开longlong,方案数可能很大(造一个完全图)2,要从合法的状态转移3,特判只有一个点的数据T2一道计算几何题首先......
  • 2023.2.16 LGJ Round
    A你有一个数组\(a\),初始为\(0\),你要使\(a_i\geh_i\),你可以把任意相邻两个\(a\),一个加一,另一个加二。问最少操作多少次。\(n,h\le1e6\)。B你需要求大小为\(n\)的环的个数,使得旋转后都不同。你可以选若干个点出来染上\(k\)个颜色中的一个,但是相邻两个点不能都能染颜......
  • Solution Set - 咋提玄坛 | 说无可说
    说无可说。Ihavenothingtosay.Mihavasnenionpordiri.J'airienàdire.说无可说Link。我说,我去,暴力dp一次就是\(O(|S|^2)\)的了,直接起飞!题目说,我只要求相似度为\(1\sim8\)的字符串对数,theremustbeareason。我说,原来可以dfs,太神奇啦!但是这要怎么......
  • Solution Set【2024.2.15】
    A.枇杷树考虑从增量的角度计算答案,若我们在构造树\(T_n\)时已经得到了树\(T_x\)和树\(T_y\)的答案\(Ans_x\)和\(Ans_y\),我们考虑如何得出\(Ans_n\)。考虑\(Ans_n\)与\(Ans_x+Ans_y\),发现即为跨越新增的边的所有路径权值之和。其可以表达为:\[f(x,u)\timessi......
  • Solution - Hangar Hurdles
    Link。感谢苏泊尔的题解,一点补充。首先呢,可以处理出中心在每个格子\((x,y)\)上的最大边长\(d_{x,y}\)。这个用一下二维前缀和统计#的个数再简单二分一下就好了,注意不能出界。然后呢我们只能上下左右移动,考虑转化成一个图论问题(?)。所以就直接相邻的格子连边就好了,因为是双......
  • Solution - Holes
    Link。暴力做是\(O(nm)\)的。怎么优化呢?I'venoslightestidea......