首页 > 其他分享 >2023.11.4测试

2023.11.4测试

时间:2023-11-05 09:22:04浏览次数:37  
标签:return freopen int 2023.11 测试 sum lcm LL

\[\text{NOIP模拟赛-2023.11.4} \]

T1 难题

设 \(f(i)\) 表示最小的非 \(i\) 因数的正整数,求 \(\sum\limits_{i=1}^nf(i)\)

\(T\leq 10^4\),\(1\leq n\leq 10^{16}\)

考虑计算数 \(x\) 对 \(f(1\sim n)\) 的贡献

通过分析可以发现,\(1\sim x\) 能筛掉的数的个数为 \(n-\dfrac{n}{\operatorname{lcm}(1\dots x)}\),因为如果你不能被筛掉就肯定同时是 \(1\sim x\) 的倍数,这样的数有 \(\dfrac{n}{\operatorname{lcm}(1\dots x)}\) 个。根据容斥可得:\(x\) 的贡献为 \(\dfrac{n}{\operatorname{lcm}(1,\dots x-1)}-\dfrac{n}{\operatorname{lcm}(1\dots x)}\)

code
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define LL long long
using namespace std;

const LL MOD=1e9+7;

LL n,ans;

LL lcm(LL x,LL y)
{
	return x/__gcd(x,y)*y;
}

void mian()
{
	scanf("%lld",&n);

	// if(n==1)

	LL last=1,ans=0,i=2;
	while(1)
	{
		LL cur=lcm(last,i);
		(ans+=i*(n/last-n/cur)%MOD)%=MOD;
		if((last=cur)>n)
			break;
		i++;
	}

	printf("%lld\n",ans);
}

int main()
{
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);

	int T;
	scanf("%d",&T);
	while(T--)
		mian();
	
	return 0;
}

T2 矩阵游戏

CF446B DZY Loves Modification

考场直接贪心取最大的行或列获得 \(58\) 分

对于这种操作题,有一部分的操作顺序都是无影响的,比如这题,因为每个点最后的贡献取决于被选中的次数,所以顺序其实不重要

再考虑贪心,如果我们直接贪心显然是错误的,行和列相互交叉会影响贪心的正确性。但我们发现行和行之间是互不影响的,所以我们可以对行和列分别进行贪心,然后枚举操作行的次数进行答案统计

(由于考场写了线段树,于是直接魔改)

code
#include<bits/stdc++.h>
#define pli pair<LL,int>
#define LL long long
using namespace std;

const int N=1e3+10,K=1e6+10;

int n,m,k,d;
LL a[N][N],sum[N<<1],ansr[K],ansc[K];
	
#define lc(p) p<<1
#define rc(p) p<<1|1
struct SegmentTree
{
	LL ad;  pli mx;
	#define mx(x) tree[x].mx
	#define ad(x) tree[x].ad

	void add(LL v)
	{
		ad+=v;  mx.first+=v;
	}
}tree[N<<3];

pli pmax(pli x,pli y)
{
	if(x.first<y.first)
		return y;
	return x;
}

void pushup(int p)
{
	mx(p)=pmax(mx(lc(p)),mx(rc(p)));
}

void build(int p,int l,int r)
{
	if(l==r)
	{
		mx(p)={sum[l],l};
		return;
	}
	int mid=(l+r)>>1;
	build(lc(p),l,mid);
	build(rc(p),mid+1,r);
	pushup(p);
}

void change(int p,int l,int r,int pos,LL v)
{
	if(l==r)
		return tree[p].add(v),void();
	int mid=(l+r)>>1;
	if(pos<=mid)
		change(lc(p),l,mid,pos,v);
	else
		change(rc(p),mid+1,r,pos,v);
	pushup(p);
}

pli ask(int p,int l,int r,int ql,int qr)
{
	if(ql<=l && qr>=r)
		return mx(p);
	int mid=(l+r)>>1;  pli res={-1e18,0};
	if(ql<=mid)
		res=pmax(res,ask(lc(p),l,mid,ql,qr));
	if(qr>mid)
		res=pmax(res,ask(rc(p),mid+1,r,ql,qr));
	return res;
}

int main()
{
	freopen("matrix.in","r",stdin);
	freopen("matrix.out","w",stdout);

	scanf("%d%d%d%d",&n,&m,&k,&d);
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
			scanf("%lld",&a[i][j]),sum[i]+=a[i][j];
	
	for(int i=1; i<=m; i++)
		for(int j=1; j<=n; j++)
			sum[i+n]+=a[j][i];
	
	build(1,1,n+m);

	for(int i=1; i<=k; i++)
	{
		pli res=ask(1,1,n+m,1,n);
		ansr[i]=ansr[i-1]+res.first;
		change(1,1,n+m,res.second,-1LL*m*d);
	}
	for(int i=1; i<=k; i++)
	{
		pli res=ask(1,1,n+m,n+1,n+m);
		ansc[i]=ansc[i-1]+res.first;
		change(1,1,n+m,res.second,-1LL*n*d);
	}

	LL ans=-1e18;
	for(int i=0; i<=k; i++)
	{
		ans=max(ans,ansr[i]+ansc[k-i]-1LL*i*(k-i)*d);
		if(n==900)
			printf("%lld %lld\n",ansr[i],ansc[k-i]);
	}

	printf("%lld\n",ans);
	
	return 0;
}

T3 括号序列

CF1598F RBS

dp 再不训没救了

很经典的 \(1,-1\) 给 \(\texttt{(},\texttt{)}\) 赋值,设 \(val_i\) 表示每个字符串的权值

我们发现,如果一个串存在某段前缀使得权值小于 \(0\),则它后面不管接什么都无法产生新的贡献。设存在一个前缀值均大于等于 \(0\) 的串 \(S\),考虑在它后面接上一个新串 \(T\)

设 \(pre_i\) 表示字符串最小的前缀值

  • 若 \(val_S+pre_T<0\),则接上 \(T\) 后无法再接其它的串产生新的贡献。\(T\) 产生的贡献为第一个等于 \(pre_T\) 的位置之前值为 \(-val_S\) 的个数

  • 否则,\(T\) 贡献为 所有值为 \(-val_S\) 的个数

第二种情况可以用桶记录,第一种情况本质上就是在 \(-val_S-1\) 出现之前 \(-val_S\) 的个数,也可以记录

下面考虑转移,设 \(f_s\) 表示选择的字符串集合为 \(s\) 的匹配数。但由于我们之前的讨论都基于串 \(S\) 的前缀值均不小于 \(0\),所以我们令 \(f_s\) 中的 \(s\) 必须存在一种顺序拼起来是合法的。记 \(flag_s\) 表示 \(s\) 是否合法,不合法则不转移。合法的话枚举 \(i\notin s\),若是第一种情况我们不更新 \(f\),直接更新 \(ans\)。若是第二种情况,我们更新 \(f_{s'}\),并令 \(flag_{s'}=1\)

code
#pragma GCC optimzie(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;

const int N=25,M=4e5+10,SS=(1<<20)+10;

int n,pre[N],val[N],sumV[SS],f[SS],ans;
string s[N];
int t[N][M<<1],tt[N][M<<1];
bool legal[SS];

int main()
{
	freopen("seq.in","r",stdin);
	freopen("seq.out","w",stdout);

	ios::sync_with_stdio(false);
	cin.tie(0);  cout.tie(0);

	cin>>n;
	for(int i=1; i<=n; i++)
	{
		cin>>s[i];

		int len=s[i].size(),sum=0;
		pre[i]=len+1;
		for(int j=0; j<len; j++)
		{
			sum+=(s[i][j]=='('? 1:-1);
			pre[i]=min(pre[i],sum);
			t[i][sum+M]++;
			if(t[i][sum+M]==1)
				tt[i][sum+M+1]=t[i][sum+M+1];
		}
		val[i]=sum;
	}
	
	int S=(1<<n)-1;
	for(int s=0; s<=S; s++)
	{
		for(int i=1; i<=n; i++)
		{
			if(s&(1<<i-1))
			{
				sumV[s]=sumV[s^(1<<i-1)]+val[i];
				break;
			}
		}
	}

	legal[0]=1;
	for(int s=0; s<=S; s++)
	{
		if(!legal[s])
			continue;
		for(int i=1; i<=n; i++)
		{
			if(s&(1<<i-1))
				continue;
			int ss=s^(1<<i-1);
			if(sumV[s]+pre[i]<0)
				ans=max(ans,f[s]+tt[i][-sumV[s]+M]);
			else
				f[ss]=max(f[ss],f[s]+t[i][-sumV[s]+M]),legal[ss]=1;
		}
	}

	ans=max(ans,f[S]);

	cout<<ans;

	return 0;
}

T4 道路

给定 \(n(\leq 32500)\),构造一个起点是 \(1\),终点是 \(114\) 的 DAG,满足从起点到终点恰有 \(n-1\) 条路径,且路径权值和取遍 \([0,n]]\) 的整数,点数 \(\leq 18\),边数 \(\leq 45\)

好题,学到了

取遍 \([0,n]\) 很容易让人想到二进制优美的性质,于是从二进制的角度出发。以 \(n=13\) 为例,将 \(13\) 拆成 \(0+[0,2^2+2^1+2^0],8+[0,2^1+2^0],12+[0,2^0]\) 即可

(不知道为什么我的代码只有 \(90\) 分)

<summarydode< summary="">
#include<bits/stdc++.h>
using namespace std;

const int N=20,M=50;

int n,s,t,cnt;
struct Graph{int x,y,z;}e[M];  int tot=0;

int main()
{
	// freopen("road.in","r",stdin);
	// freopen("road.out","w",stdout);
	
	scanf("%d",&n);

	if(n==1)
	{
		printf("2 2\n1 114 0\n1 114 1");
		return 0;
	}
	
	cnt=__lg(n);

	int pw=1,sum=0;  //cout<<cnt<<endl;
	for(int i=1; i<=cnt; i++)
	{
		if(i==1)
			e[++tot]={2,114,0},e[++tot]={2,114,1};
		else
			e[++tot]={i+1,i,0},e[++tot]={i+1,i,pw};
		sum+=pw;  pw<<=1;
	}

	int tmp=0;
	for(int i=cnt; i>=0; i--)
	{
		// cout<<i<<" "<<tmp<<" "<<sum<<endl;
		if(tmp+sum<=n)
		{
			if(i>=1)
				e[++tot]={1,i+1,tmp};
			else
				e[++tot]={1,114,tmp};
			tmp+=sum+1;
		}
		pw>>=1;  sum-=pw;
	}


	printf("%d %d\n",cnt+2,tot);
	for(int i=1; i<=tot; i++)
		printf("%d %d %d\n",e[i].x,e[i].y,e[i].z);
	
	return 0;
}

标签:return,freopen,int,2023.11,测试,sum,lcm,LL
From: https://www.cnblogs.com/xishanmeigao/p/17809431.html

相关文章

  • 2023.11.4——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.软考知识明日计划:学习......
  • 基于FPGA的Lorenz混沌系统verilog开发,含testbench和matlab辅助测试程序
    1.算法运行效果图预览   将vivado的仿真结果导入到matlab显示三维混沌效果:    2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述      洛伦兹混沌系统是一种非线性动力系统,最初由爱德华·洛伦兹(EdwardLorenz)于1963年引入,它的简单方......
  • Jmeter分布式测试的注意事项和常见问题
    Jmeter分布式测试的注意事项和常见问题Jmeter是一款开源的性能测试工具,使用Jmeter进行分布式测试时,也需要注意一些细节和问题,否则可能会影响测试结果的准确性和可靠性。Jmeter分布式测试时需要特别注意的几个方面1.参数化文件的位置和内容如果使用csv文件进行参数化,即通过......
  • 2023.11.4
    提前打摆开始写总结。A记\(\displaystlef(x)=\min_{i\in\mathbb{N^+}}\),求\(\displaystyle\sum_{i=1}^{n}f(i)\).答案模\(1\mathrm{e}9+7\),多测。\(n\le10^{16}\),\(T\le10^4\).从小到大考虑每个\(f(i)\)的出现次数。若当前求\(x\)的出现次数,那么符合的是\(\b......
  • 打印机 zebra 斑马 ZT211CN 测试备忘
    条码打印系统  首页-神奇条码标签打印系统(shenqitiaoma.com) 斑马 ZT211CN  ZT211IndustrialPrinterSupport&Downloads|Zebra产品序号(SN): T2J231600121  ,Zebra 通过sn查询产品型号,找到相关手册和问题排除文档。 设置注意事项:1、设置ip后,重启打印机,在......
  • 2023.11.3——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.软考知识明日计划:学习......
  • 基于仿真的飞机ICD工具测试
    ​机载电子系统是飞机完成飞行任务的核心保障之一。从1949年新中国建立至今70余年的发展过程中,随着我国在航空航天领域的投资逐年增多,机载电子系统大致经历了四个发展过程阶段,按照出现的先后顺序进行排序,分别为:1、分立式机载电子系统:由多个不同并且分别独立的子系统采用离散的形......
  • 如何实施符合功能安全及ASPICE要求的模型动态测试 ——TPT Workshop邀请函
    尊敬的女士/先生:2023年3月,北汇信息与诸多工程师相约上海,成功举办了今年第一场TPTWorkshop活动,与大家进行了深入的技术交流。如今,2023年已渐渐步入尾声,我们将在北汇信息上海总部再次举办题为“如何实施符合功能安全及ASPICE要求的模型动态测试”的TPTWorkshop活动,诚邀各位新老......
  • MySQL使用函数、存储过程实现:向数据表快速插入大量测试数据
    实现过程创建表CREATETABLE`user`( `id`INT(11)NOTNULLAUTO_INCREMENT, `name`VARCHAR(20)DEFAULTNULL, `age`INT(3)DEFAULTNULL, `pwd`VARCHAR(20)DEFAULTNULL, `address`VARCHAR(30)DEFAULTNULL, PRIMARYKEY(`id`))ENGINE=INNODBAUTO_INCREMENT=......
  • 单元测试编写
      @SpringBootTest@RunWith(SpringJUnit4ClassRunner.class)publicclassHelloTest{@AutowiredprivateSysDictionaryDaodictionaryDao;@Beforepublicvoidbefore(){TableInfoHelper.initTableInfo(newMapperBuilderAssista......