首页 > 其他分享 >2023.7.3测试

2023.7.3测试

时间:2023-08-07 20:15:31浏览次数:35  
标签:return int LL times step 2023.7 测试 MOD

T1 边的方向

一个无重边、自环的无向图,现在给每条边标上方向,要求每个点有且只有一条出边,求有多少种合法的方案,答案模 \(998244353\)

\(1\leq n,m\leq 2\times 10^5\)

不算很难的题

若 \(m<n\) 或者存在度数为 \(0\) 的点直接输出 \(0\)

之后把所有度数为 \(1\) 的点的边全部标好方向并删掉,剩下一些存在环的图

如果环里套环,即某个点的度数不为 \(2\),那么就输出 \(0\),否则记 \(cnt\) 为环的个数,答案就为 \(2^{cnt}\)

#include<bits/stdc++.h>
#define LL long long
#define mp make_pair
using namespace std;

const int N=200010;
const LL MOD=998244353;

int n,m,deg[N],cnt;
vector < pair<int,int> > g[N];
bool e[N],flag[N],vis[N];
LL ans=1;

void dfs(int x)
{
	vis[x]=1;
	for(int i=0; i<g[x].size(); i++)
	{
		if(!e[g[x][i].second])
		{
			int y=g[x][i].first;
			if(!vis[y] && !flag[y])
				dfs(y);
		}
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1; i<=m; i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		g[x].push_back(mp(y,i));
		g[y].push_back(mp(x,i));
		deg[x]++;  deg[y]++;
	}
	
	if(m<n)
	{
		printf("0");
		return 0; 
	}
	
	for(int i=1; i<=n; i++)
	{
		if(!deg[i])
		{
			printf("0");
			return 0;
		}
	}
	
	for(int i=1; i<=n; i++)
	{
		if(deg[i]==1)
		{
			int x=i;
			do
			{
				int y=0,z=0;
				for(int j=0; j<g[x].size(); j++)
				{
					if(!e[g[x][j].second])
					{
						y=g[x][j].first;  z=g[x][j].second;
						break;
					}	
				}
				
				deg[x]--;  deg[y]--;
				e[z]=1;  flag[x]=1;
				if(deg[y]==0 && !flag[y])
				{
					printf("0");
					return 0;
				}
				x=y;
			}while(deg[x]==1);
		}
	}
	
	for(int i=1; i<=n; i++)
	{
		if(!flag[i] && deg[i]!=2)
		{
			printf("0");
			return 0;
		}
	}
	
	for(int i=1; i<=n; i++)
	{
		if(!flag[i] && !vis[i])
			dfs(i),cnt++;	
	}
	
	for(int i=1; i<=cnt; i++)
		(ans*=2)%=MOD;
		
	printf("%lld",ans);
	
	return 0;
} 

T2 游戏得分

有长度为 \(n\) 的数组 \(a\) 满足 \(a_i=i\)。设 \(p\) 是 \(1\cdots n\) 的某个排列,现在重复操作:令 \(a_{p_i}=a_i\),直到 \(a\) 恢复到原来 \(a_i=i\) 的样子,记操作次数为 \(x\)。那么该排列的得分 \(f(p)=x^k\),其中 \(k\) 是输入的。对于所有 \(1\cdots n\) 的所有排列 \(p\),求它们的得分之和即 \(\sum{f(p)}\)。答案模 \(998244353\)

\(2\leq n\leq 50\),\(1\leq k\leq 10000\)

考场上努力搞出来了(被薄纱)

首先可感觉到排列的变换过程中会存在一些分组,组内的数字不断交换,但组与组之间没有联系。而每个组内部一次循环所需的操作数是数字的个数,最后的操作次数就是所有组操作次数的最小公倍数

由于数据比较小,所以我们可以暴力地从大到小去递归枚举组内的数字数量。记状态 \(f(step,s,pre,cur)\) 表示当前枚举到的组内数字数量为 \(step\),当前还有 \(s\) 个数字没有被分组,前面分组产生的贡献为 \(pre\),当前最小公倍数为 \(cur\)。

那么,我们枚举分组的组数 \(i\),则此次分组产生的贡献为

\[\binom{s}{i\times step}\times \frac{\prod\limits_{j=1}^{i}{\binom{j\times step}{step}}}{i!}\times \left((step-1)!\right)^i \]

更新 \(pre\) 和 \(cur\) 把它带到下一层去,在 \(step=0\) 时用 \(pre\times cur^k\) 更新答案即可

#include<bits/stdc++.h>
#define LL long long
using namespace std;

const int N=60;
const LL MOD=998244353;

int n,a[N];
LL k,ans,tot[N],fac[N],inv[N];
bool v[N];

LL gcd(LL a,LL b)
{
	if(b==0)
		return a;
	return gcd(b,a%b);
}

LL lcm(LL a,LL b)
{
	return a*b/gcd(a,b);
}

LL ksm(LL x,LL y)
{
	LL res=1;
	while(y)
	{
		if(y&1)
			res=res*x%MOD;
		x=x*x%MOD;
		y>>=1;
	}
	
	return res;
}

void prework()
{
	fac[0]=inv[0]=1;
	for(int i=1; i<=n; i++)
	{
		fac[i]=(fac[i-1]*i)%MOD;
		inv[i]=ksm(fac[i],MOD-2);
	}
}

LL C(int x,int y)
{
	if(y>x)
		return 0;
	return fac[x]*inv[x-y]%MOD*inv[y]%MOD;	
}

LL count(int t,int x)
{
	LL res=1;
	for(int i=t*x; i>=x; i-=x)
		(res*=C(i,x))%=MOD;
	(res*=inv[t])%=MOD;
	
	return res;
}

void dfs(int step,int s,LL pre,LL cur) //step枚举到的层数,s现在还有多少人,pre之前的贡献,cur当前最小公倍数 
{
	if(s==0)
	{
		(ans+=1LL*pre*ksm(cur,k)%MOD)%=MOD;
		return;
	}
	if(step==0)
		return;
	
	for(int i=0; i*step<=s; i++)
		dfs(step-1,s-i*step,pre*count(i,step)%MOD*ksm(fac[step-1],i)%MOD*C(s,i*step)%MOD,lcm(cur,i==0?cur:(LL)step));
}

int main()
{
	scanf("%d%lld",&n,&k);
	
	prework();
	
	dfs(n,n,1,1);
	
	printf("%lld",ans);
	
	return 0;
}

T3 Group Projects

又又又是插入 \(\rm dp\)!!!

显然要排序(我也不知道怎么显然),将 \(a_i\) 从小到大排序。因为我们不关注具体如何分组,只关心差值是多少,所以排完序是有利于我们去计算贡献的

状态的第一维显然是考虑到第 \(i\) 个数,还是考虑将 \(a_i\) 插入到前面的额某个组中,所以我们第二维状态可以记还有多少个组是不完整的(即可被插入),当然我们还要用第三维来记录当前的“不和谐度”之和

将 \(a\) 丢到数轴上理解,显然新加入的 \(a_i\) 会对之前不完整的组造成影响,产生 \((a_i-a_{i-1})\times j\) 的贡献,\(j\) 为组数,我们这这里费用提前计算,当后面的数字插入时就无需考虑插入到哪一个组里。记 \(p=(a_i-a_{i-1})\times j\),下面我们分类讨论:

  • 当 \(a_i\) 单独成组时

    \(f[i-1][j][k]\rightarrow f[i][j][k+p]\)

  • 当 \(a_i\) 作为组的中间时,可以随便选一个插入

    \(f[i-1][j][k]\times j \rightarrow f[i][j][k+p]\)

  • 当 \(a_i\) 作为一个组的结尾时,组数会 \(-1\)

    \(f[i-1][j][k]\times j\rightarrow f[i][j-1][k]\)

  • 当 \(a_i\) 作为一个组的开头时,组数要 \(+1\)

    \(f[i-1][j][k]\rightarrow f[i][j+1][k]\)

#include<bits/stdc++.h>
using namespace std;

const int N=210,M=1010;
const int MOD=1e9+7;

int n,m,a[N],f[N][N][M];

int main() 
{
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)
		scanf("%d",&a[i]);
		
	sort(a+1,a+1+n);
	
	f[0][0][0]=1;
	for(int i=1; i<=n; i++)
	{
		for(int j=0; j<=n; j++)
		{
			int p=(a[i]-a[i-1])*j;
			for(int k=0; k+p<=m; k++)
			{
				(f[i][j][k+p]+=1LL*f[i-1][j][k]*(j+1)%MOD)%=MOD;
				if(j!=n)
					(f[i][j+1][k+p]+=f[i-1][j][k])%=MOD;
				if(j!=0)
					(f[i][j-1][k+p]+=1LL*f[i-1][j][k]*j%MOD)%=MOD;
			}
		}
	}
	
	int ans=0;
	for(int i=0; i<=m; i++)
		(ans+=f[n][0][i])%=MOD;
	
	printf("%d",ans);
	
	return 0;
}

T4 卡片 查看测评数据信息

有 \(3n\) 张卡片从左往右排成一行,第 \(i\) 张卡片写有一个整数 \(a[i]\),代表这个卡片的价值,其中 \(1<=a[i]<=n\)。

重复以下操作 \(n-1\) 次:

1、针对当前剩下的卡片,你可以对最左边的 \(5\) 张卡片任意调整次序,调整结束后,若最左边的 \(3\) 张卡片的价值相同,那么你的得分会增加 \(1\)。

2、最左边的 \(3\) 张卡片会被删除。

若最终剩下的 \(3\) 张卡片的价值相同,你得分再增加 \(1\) 分。

输出最大总得分。

输出 \(n\) 喜提 \(9\) 分

\(100+100+0+9=209\),\(\rm rk 8\)

标签:return,int,LL,times,step,2023.7,测试,MOD
From: https://www.cnblogs.com/xishanmeigao/p/17612588.html

相关文章

  • 谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题
    1摘要内核和硬件等低级系统已被证明极难进行有效测试,因此,许多内核测试都是以手动为主方式进行的。现有的大多数测试框架都是为测试与底层平台隔离的高级软件而设计的,而底层平台被假定是稳定可靠的。测试底层平台本身需要一套全新的假设,这些假设必须从根本上反映在框架的设计中。......
  • 2023.7.5测试
    T1排队打水小学级别的贪心题T2Oversleeping一道不错的扩欧题,一开始没反应过来,一直搞不等式……根据题意可以知道在\(B\)站停留的时间区间为\([k(2n+2m)+n,k(2n+2m)+n+m)\quad(k\in\mathbb{Z})\)清醒的时间区间为\([k'(p+q)+p,k'(p+q)+p+q)\quad(k'\in\mathbb{Z})\)......
  • 2023.8.3测试
    一场\(\rmNOIP\)模拟赛搬了四道Atcoder的题T1跑路一个\(n\timesm\)的\(01\)矩阵\(A\),从左上角出发,每次向下走或向右走,终点为右下角。若路径途中只经过\(0\),则称\(A\)为“好矩阵”。给定矩阵\(A\),每次可以选择它的一个子矩阵取反,求将\(A\)变成“好矩阵”的最小......
  • Apipost接口自动化测试入门
    今天我们来聊一聊接口自动化测试。以往我们都是以以代码的形式编写自动化测试脚本做自动化测试,网上也有非常多的攻略,那么在不会代码的情况下该怎么做接口自动化呢,今天给大家介绍Apipost自动化测试模块,不用写代码也能做接口自动化!点击左侧菜单栏「自动化测试」按钮进入自动化测试页......
  • Markdown测试页
    AwesomeEditor!Ithasbeenreleasedasopensourcein2018andhascontinuallyevolvedtoreceive10kGitHub⭐️Stars.CreateInstanceYoucancreateaninstancewiththefollowingcodeandusegetHtml()andgetMarkdown()oftheEditor.consteditor=new......
  • 性能测试-基础篇
    前言:性能是什么 每个人眼里对性能理解不一样,但是我们如果从一个App的维度来看: 用户眼中的性能:1、App使用崩溃,卡顿,延迟2、App反应慢,使用页面无反应 那开发眼中的性能:1、数据库设计是否合理2、代码逻辑、算法是否可以优化 运维眼中的性能:1、服务器资源使用是否合理......
  • 软件测试|web自动化测试神器playwright教程(二十七)
    前言使用selenium进行web自动化测试,如果我们打开了多个网页,进行网页切换时,我们需要先获取各个页面的句柄,通过句柄来区分各个页面,然后使用switch_to.window()实现切换,这样的操作比较麻烦,playwright的网页切换比selenium更为简单快捷。本文就给大家介绍一下playwright多个网页的切......
  • 软件测试|JMeter 参数化的方式有哪些
    JMeter中常见的参数化方式包括:CSV数据文件:从CSV文件中读取数据,并将其用于请求参数。数据库访问:从数据库中读取数据,并将其用于请求参数。用户定义的变量:手动定义变量值,并将其用于请求参数。随机变量:随机生成变量值,并将其用于请求参数。Counter:生成一个递增的计数器,并将其......
  • 软件测试|web自动化测试神器playwright教程(二十八)
    前言在我们使用部分网站的时候,我们会遇到进行日期选择的问题,比如我们预定火车票或者预定酒店,需要选择发车日期或者酒店的入住与退房时间。我们执行自动化测试遇到日期控件时,如果可以输入,可以使用selenium的send_keys()方法进行输入,playwright同样也可以实现对日期控件的操作,本文......
  • ku安装及测试
    1)修改内核参数和模块cat<<EOF>/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables=1net.bridge.bridge-nf-call-iptables=1EOF#使内核参数配置生效sysctl--system&&modprobebr_netfilter&&lsmod|grepbr_netfilter2)关闭交换内存swapoff-a&......