首页 > 其他分享 >刷题记录_2024寒假2/19~2/21

刷题记录_2024寒假2/19~2/21

时间:2024-02-21 11:22:27浏览次数:28  
标签:21 19 sum 2024 int num bmatrix mod matrix

P4287 [SHOI2011] 双倍回文

考虑马拉车,但是我不会马拉车

怎么办,考虑PAM

我们在记录一般的fail之外再记录一个trans指针指向小于等于当前节点长度一半的最长回文后缀

然后枚举每个节点

#include<bits/stdc++.h>
using namespace std;
char s[2000001];
int len[2000001],trans[2000001],n,num[2000001],fail[2000001],last,cur,pos,trie[2000001][26],tot=1;
int getf(int x,int i)
{
	while(i-len[x]-1<0||s[i-len[x]-1]!=s[i])x=fail[x];
	return x;
}
int main()
{
	cin>>n;
	scanf("%s",s);
   
    fail[0]=1;len[1]=-1;
    for(int i=0;i<n;i++){
    	pos=getf(cur,i);
        if(!trie[pos][s[i]-'a']){
        	fail[++tot]=trie[			getf(fail[pos],i)][s[i]-'a'];
        	trie[pos][s[i]-'a']=tot;
        	len[tot]=len[pos]+2;
            num[tot]=num[fail[tot]]+1;
            if(len[tot]<=2) trans[tot]=fail[tot];
        	else{	
	            int tmp=trans[cur];
	            while(s[i-len[tmp]-1]!=s[i]||((len[tmp]+2)<<1)>len[tot]) tmp=fail[tmp];
	            trans[tot]=trie[tmp][s[i]-'a'];
	        }
		}
        cur=trie[pos][s[i]-'a'];
   	}
   	int ans=0;
   	for(int i=2;i<=tot;i++)
        if(((len[trans[i]]<<1)==len[i]&&len[trans[i]]%2==0))
            ans=std::max(ans,len[i]);
    printf("%d\n",ans);
	return 0;
}

暴力枚举每个节点用trans判断

CF1895F Fancy Arrays

妙妙数数题

考虑容斥可以做掉第一个限制,然后就可以dp了

dp好慢,注意到可以写出转移矩阵,然后快速幂搞一发

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int T,ans,b;
int n,x,k;
struct node{
	int dp[41][41];
	node operator*(const node &A)const{
		node sum;
		for(int i=0;i<x;++i)
			for(int j=0;j<x;++j)
				for(int k=0;k<x;++k)
					sum.dp[i][j]=(sum.dp[i][j]+dp[i][k]*A.dp[k][j])%mod;
		return sum;
	}
}a,res;
int qpow(int a,int b){
	int sum=1;
	while(b){
		if(b&1)sum*=a,sum%=mod;
		a*=a,a%=mod;
		b>>=1;
	}
	return sum;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin>>T;
	while(T--){
		cin>>n>>x>>k;
		ans=qpow(2*k+1,n-1)*(x+k)%mod;
		for(int i=0;i<x;++i)
			for(int j=0;j<x;++j)
				a.dp[i][j]=(abs(i-j)<=k);
		res=node();
		for(int i=0;i<x;++i)
			res.dp[0][i]=1;
		b=n-1;
		while(b){
			if(b&1)res=res*a;
			a=a*a;
			b>>=1;
		}
		for(int i=0;i<x;++i)
			ans=(ans-res.dp[0][i]+mod)%mod;
		cout<<ans<<"\n";
	}
	return 0;
}

P7453 [THUSCH2017] 大魔法师

经典的矩阵乘法线段树

每个节点存向量

\[\begin{bmatrix} A\\ B \\ C \\ len \end{bmatrix} \]

给出每个操作的变换矩阵

\[\begin{bmatrix} 1& 1& 0& 0& \\ 0& 1& 0& 0& \\ 0& 0& 1& 0& \\ 0& 0& 0& 1& \end{bmatrix} \]

\[\begin{bmatrix} 1& 0& 0& 0& \\ 0& 1& 1& 0& \\ 0& 0& 1& 0& \\ 0& 0& 0& 1& \end{bmatrix} \]

\[\begin{bmatrix} 1& 0& 0& 0&\\ 0& 1& 0& 0&\\ 1& 0& 1& 0&\\ 0& 0& 0& 1& \end{bmatrix} \]

\[\begin{bmatrix} 1& 0& 0& v& \\ 0& 1& 0& 0& \\ 0& 0& 1& 0& \\ 0& 0& 0& 1& \end{bmatrix} \]

\[\begin{bmatrix} 1& 0& 0& 0& \\ 0& v& 0& 0& \\ 0& 0& 1& 0& \\ 0& 0& 0& 1& \end{bmatrix} \]

\[\begin{bmatrix} 1& 0& 0& 0& \\ 0& 1& 0& 0& \\ 0& 0& 0& v& \\ 0& 0& 0& 1& \end{bmatrix} \]

然后可以码了

然后寄了

稍微卡常,矩阵乘法循环展开,取模用一定减法代替

#include<bits/stdc++.h>
#define ls (now<<1)
#define rs (now<<1|1)
using namespace std;
const int mod=998244353;
const int N=3e5+5;
int n,m;
int add(int x) {return x > mod ? x - mod : x;}
struct matrix{
    int num[4][4];

    matrix() {memset(num, 0, sizeof(num));}
    inline void clear() {memset(num, 0, sizeof(num));}
    inline void init() {num[0][0] = num[1][1] = num[2][2] = num[3][3] = 1;}//对角线1 
    matrix(const int a[][4]){
        for(int i = 0; i < 4; ++i)
            for(int j = 0; j < 4; ++j)
                num[i][j] = a[i][j];
    }
    matrix operator + (const matrix &b) const{
        matrix r;
        for(int i = 0; i < 4; ++i)
            for(int j = 0; j < 4; ++j)
                r.num[i][j] = (1ll * num[i][j] + b.num[i][j]) % mod;
        return r;
    }
    matrix operator * (const matrix &b) const{
        matrix r;
        r.clear();
        for(int i = 0; i < 4; ++i)
            for(int j = 0; j < 4; ++j){
                r.num[i][j] = add(r.num[i][j] + 1ll * num[i][0] * b.num[0][j]%mod);
                r.num[i][j] = add(r.num[i][j] + 1ll * num[i][1] * b.num[1][j]%mod);
                r.num[i][j] = add(r.num[i][j] + 1ll * num[i][2] * b.num[2][j]%mod);
                r.num[i][j] = add(r.num[i][j] + 1ll * num[i][3] * b.num[3][j]%mod);    
                // for(int k = 0; k < 4; k++) {
                //     r.num[i][j] = (r.num[i][j] + 1ll * num[i][k] * b.num[k][j] % mod) % mod;
                // }
            }
        return r;
    }
}a[N], A[4], B[4];

matrix tr[N<<2],tag[N<<2];

void pushup(int now){
	tr[now]=tr[ls]+tr[rs];
}

void pushdown(int now){
	tr[ls]=tag[now]*tr[ls];
	tr[rs]=tag[now]*tr[rs];
	tag[ls]=tag[now]*tag[ls];
	tag[rs]=tag[now]*tag[rs];
	tag[now].clear(),tag[now].init();
}

void build(int now,int l,int r){
	tag[now].init();
	if(l==r){
		tr[now]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(now);
}

void upd(int now,int l,int r,int L,int R,matrix k){
	if(L<=l and r<=R){
		tr[now]=k*tr[now];
		tag[now]=k*tag[now];
		return;
	}
	pushdown(now);
	int mid=(l+r)>>1;
	if(L<=mid) upd(ls,l,mid,L,R,k);
	if(R>mid) upd(rs,mid+1,r,L,R,k);
	pushup(now); 
}

matrix query(int now,int l,int r,int L,int R){
	if(L<=l and r<=R) return tr[now];
	pushdown(now);
	int mid=(l+r)>>1;
	matrix res;res.clear();
	if(L<=mid) res=res+query(ls,l,mid,L,R);
	if(R>mid) res=res+query(rs,mid+1,r,L,R);
	return res;
}
 
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	A[0].init(),A[1].init(),A[2].init();
	B[0].init(),B[1].init(),B[2].init();
	A[0].num[0][1]=A[1].num[1][2]=A[2].num[2][0]=1;
	B[2].num[2][2]=0;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i].num[0][0]>>a[i].num[1][0]>>a[i].num[2][0],a[i].num[3][0]=1;
	build(1,1,n);
	cin>>m;
	while(m--){
		int opt,l,r,v;
		cin>>opt>>l>>r;
		if(opt<=3) upd(1,1,n,l,r,A[opt-1]);
		else if(opt<=6){
			cin>>v;
			B[0].num[0][3]=B[1].num[1][1]=B[2].num[2][3]=v;
			upd(1,1,n,l,r,B[opt-4]);
		}
		else{
			matrix ans=query(1,1,n,l,r);
			cout<<ans.num[0][0]<<" "<<ans.num[1][0]<<" "<<ans.num[2][0]<<"\n";
		}
//		cout << tr[1].num[0][0] << '\n';
	}
}

P2522 [HAOI2011] Problem b

来点莫反

我们先考虑 P3455 [POI2007] ZAP-Queries

也就是给出 \(a,b,d\),求满足 \(1 \leq x \leq a\),\(1 \leq y \leq b\),且 \(\gcd(x,y)=k\) 的二元组 \((x,y)\) 的数量。

也就是 \(\large \sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} [gcd(i,j)=k]\)

简单思考我们能发现这个式子等价于 \(\large \sum\limits_{i=1}^{n/k} \sum\limits_{j=1}^{m/k} [\gcd(i,j)=1]\) (\(n/k,m/k\)下取整)

我们集中注意力回想一下怎么莫反于是这个式子变成了 \(\large \sum\limits_{i=1}^{n/k} \sum\limits_{j=1}^{m/k} \sum\limits_{d|\gcd(i,j)} \mu(d)\)

然后 \(\large \sum\limits_{i=1}^{n/k} \sum\limits_{j=1}^{m/k} \sum\limits_{d|i,d|j} \mu(d)\)

$=\large \sum\limits_{d=1}^{\min(n,m)} $

标签:21,19,sum,2024,int,num,bmatrix,mod,matrix
From: https://www.cnblogs.com/exut/p/18020510

相关文章

  • 【2024-02-08】连岳摘抄
    23:59保只要你心中有爱,坚定不移的爱,全心全意的爱,你就能够克服很多乱七八糟的人生难题。                                                 ——罗伯特麦卡蒙当父母老......
  • 【2024-02-07】连岳摘抄
    23:59年意其实不在任何其他地方,它原本就在你的心里,也在所有人的心里。年意不过是一种生活的情感、期望和生机。而年呢?就像一盏红红的灯笼,一年一度把它迷人地照亮。                                   ......
  • 中国医疗健康行业2023年关键词盘点及2024年趋势展望
    经历了爆发式、跨越式发展之后,中国医药和医疗健康产业迈入新的发展阶段。2022年,受到资本市场整体下行、医药医疗行业增长放缓等因素影响,医疗健康领域的投融资回归理性,企业估值加速去泡沫化,市场开始自我梳理和审视。中国医药健康赛道创新趋势如何?敬请关注本文关于启明创投主管合伙......
  • 【2024-02-05】就想一起
    20:00失败并非总是错误的,它可能是我们在当时所能做的最好选择。真正的错误是停止尝试。                                                 ——斯金纳母亲昨晚,再次表达......
  • 洛谷题单指南-递推与递归-P1010 [NOIP1998 普及组] 幂次方
    原题链接:https://www.luogu.com.cn/problem/P1010题意解读:输出一个正整数的2的幂次方表示,需要用到二进制数学知识,将整数拆解成2的次幂之和,幂次方也要进行拆解,因此容易想到通过递归处理。解题思路:先看样例,给定整数137,要拆解成2的幂次方之和,先考虑i使得刚好137>=2^i时,i取7,因此2......
  • 【2024-02-06】连岳摘抄
    23:59要胆大,更要心细。保持心情快乐,骑着马去会会命运。                                                 ——托尔金一个男人40多岁,你也认识20多年了,评价依然是“非......
  • 面试题2024
    1.美团真题1 - 给定场景,说说你的测试用例设计思路2.美团真题2 - 登录场景session原理及测试注意事项Session的原理主要涉及客户端和服务器之间的交互过程:用户提交登录信息:当用户在登录页面输入用户名和密码,并点击登录按钮时,浏览器会发送一个HTTP请求到服务器(向服务器发送登......
  • 云原生周刊:在 Kubernetes 集群中使用通配符证书 | 2024.2.19
    开源项目推荐kube-fledgedkube-fledged是一个KubernetesOperator,用于直接在Kubernetes集群的工作节点上创建和管理容器映像的缓存。它允许用户定义图像列表以及这些图像应缓存(即拉取)到哪些工作节点上。因此,应用程序Pod几乎立即启动,因为不需要从注册表中提取映像。kube-f......
  • 【专题】2024中国消费电子和家电行业趋势报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35177原文出处:拓端数据部落公众号中国是全球消费电子和家用电器的重要制造基地和出口国,占据全球市场超过22%的销售份额。在亚太市场销量方面也占据重要地位。作为“世界工厂”,中国拥有庞大的电子制造和出口能力,涵盖智能手机、电脑、电视、消费类电......
  • Studio 3T 2024.1 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持
    Studio3T2024.1(macOS,Linux,Windows)-MongoDB的专业GUI、IDE和客户端,支持自然语言查询TheprofessionalGUI,IDEandclientforMongoDB请访问原文链接:Studio3T2024.1(macOS,Linux,Windows)-MongoDB的专业GUI、IDE和客户端,支持自然语言查询,查看最新版......