2025国庆Day5

模拟赛

T1

枚举b3

n^2 处理出a_b1^a_b2=x的所有情况(满足b2<i)

然后枚举b4,计算答案

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<bits/stdc++.h>
#define int long long
#define jiaa(a,b) {a+=b;if(a>=MOD) a-=MOD;}
#define jian(a,b) {a-=b;if(a<0) a+=MOD;}
using namespace std;
int ksm(int a,int b,int p){
	if(b==0) return 1;
	if(b==1) return a%p;
	int c=ksm(a,b/2,p);
	c=c*c%p;
	if(b%2==1) c=c*a%p;
	return c%p;	
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int a[5005];
int mm[2000005];
signed main()
{
	//freopen("filename.in", "r", stdin);
	//freopen("filename.out", "w", stdout);
	int n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	} 
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			int zh=a[i]^a[j];
			ans+=mm[zh];
		}
		for(int j=1;j<i;j++){
			int zh=a[i]^a[j];
			mm[zh]++;
		}
	}
	cout<<ans<<'\n';
	return 0;
}

T2

首先若一个数两列全相同,一定为0

然后将其删去

注意若一个数高位全不同,这个数一定是p-1

进而发现所有数不同的高位数量都不同

根据这个算答案即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<bits/stdc++.h>
#define int long long
#define jiaa(a,b) {a+=b;if(a>=MOD) a-=MOD;}
#define jian(a,b) {a-=b;if(a<0) a+=MOD;}
using namespace std;
int ksm(int a,int b,int p){
	if(b==0) return 1;
	if(b==1) return a%p;
	int c=ksm(a,b/2,p);
	c=c*c%p;
	if(b%2==1) c=c*a%p;
	return c%p;	
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int a[2005][4005],vis[2005];
signed main()
{
	//freopen("filename.in", "r", stdin);
	//freopen("filename.out", "w", stdout);
	int p=read();
	for(int i=0;i<p;i++){
		int sum=0;
		for(int j=0;j<p;j++) vis[j]=0;
		for(int j=0;j<2*p;j++){
			a[i][j]=read();
			if(j%2==0){
				if(!vis[a[i][j]]) sum++;
				vis[a[i][j]]=1;
			}
		}
//		cout<<sum<<'\n';
		if(sum==1){
			sum=0;
			for(int j=0;j<p;j++) vis[j]=0;
			for(int j=0;j<2*p;j++){
				if(j%2==1){
					if(!vis[a[i][j]]) sum++;
					vis[a[i][j]]=1;
				}
			}
			if(sum==1) cout<<0<<' ';
			else cout<<1<<' ';
		}
		else cout<<sum<<' ';
	}
	cout<<'\n';
	return 0;
}

T3

分治

对每个点求出到mid,mid+1的最短路

对每一行,求出当这一行最优时对哪些点产生贡献

这是一个二维数点,树状数组解决

递归时注意到最短路不一定在区间内部

所以需要处理区间内每个点到区间端点的最短路

容易发现改变的部分就是刚刚求出的到mid,mid+1最短路

注意求最短路可以dp(拐点较少,<=4),不要dij,多一个log

T4

先考虑k=1时dp

dpi,j,0/1,0/1,表示1~i插入完成最终序列有j个连续段,是否已经占据最终序列的开头,是否已经占据最终序列的结尾

image

数学

数论

素数

逆元

Wilson 定理

image

证明考虑乘法逆元

欧几里得算法

(exgcd)

image

中国剩余定理

扩展:对每个方程的模数质因数分解,对每个质数分别考虑check

转化成普通剩余定理

exgcd即可

积性函数

容易发现积性函数f(1)=1

完全积性函数,省去互素条件

埃氏筛

线性筛

思路可拓展求积性函数前缀和

整数分块

离散对数

莫比乌斯反演+欧拉反演

组合数学

插板法

例题

image

考虑乘积的组合意义

插板后对每个段加一个小球

再次进行插板

共插2p+1个板

容斥原理

min-max反演

二项式反演

斯特林数

image

image

错排

1.递推

2.容斥

卡特兰数

转化在数轴上

格路计数

两条线?

不合法容斥系数=0

prufer序列

一棵n个点有标号的无根树有n^(n-2)个

生成prufer序列:

image

还原树:

image

线性代数

矩阵加/乘

矩阵乘组合意义:i->j的方案数

向量

矩阵快速幂

高斯消元

主元和自由元

线性空间

线性相关

称一组线性空间的秩,为其最大的内部线性无关子空间

可以使用高斯消元求解

对于一组解,我们称之为线性基

正交线性基

对于每一个主元,保证只有一个数是包含它的

行列式

image

发现相邻行之间加减不影响最终结果

高斯消元变成阶梯矩阵

易求答案

posted @ 2025-10-06 20:15  gbrrain  阅读(21)  评论(0)    收藏  举报