ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

模拟13 考试总结

2021-07-24 11:35:15  阅读:88  来源: 互联网

标签:13 ch int long T1 模拟 times 考试 mod


填坑
由于这场本来就改完了就先填这篇吧

考试经过

看见题目名称就知道不太友善,照样浏览体面,果然不当人
T1看上去貌似很水,给出一个状态转移方程优化递推???先打了个暴力,然后开始想正解
就开始先手算每一项,然后推通项规律。。。
40min 我觉得我稳了
1h 感觉不太妙
1.5h (氧化钙)这。。咋全假了啊
然后最后还是弃掉了,不然没时间了
T2,二分图?我真没学过啊,咋搞啊?跳了
T3是个数学题,推了下性质,感觉70分挺好拿的,就冲上去了
剩20min先查了一遍代码,考虑是推T1还是莽T2暴力,最后推T1
一遍……路径数……这不排列组合吗……有了啊
果断开码,最后15min打上快速幂+逆元+组合数+递推式,差点抓狂,旁边的XIN吓得不轻
2min,打完了,编译。。。淦,过不了样例
于是听天由命,30+0+60=90 掉到21了
T1暴力是50,由于我的递归常数巨大成30了
T2就没打,爆零了没啥可说的,T3写挂了10分但貌似还算高的

T1.工业题

想明白这里面有一个走法就好说了
由于一个数可以走不同的路径对答案产生贡献,所以要算走法
预处理a和b的次幂,那每个\(f_{i,j}\)对答案贡献就是: \(f_{i,j}*走法数*a^{m-j}*b^{n-i}\)
然后只要把我最后10分钟打的东西调出来就是答案

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=300050;
const int mod=998244353;
int a[N],b[N],bit1[N],bit2[N];
int jc[3*N];
inline int ksm(int x,int y)
{
   int s=1;x%=mod;
   for(;y;y>>=1)
   {
     if(y&1)s=(s*x)%mod;
     x=(x*x)%mod;
   }
   return s;
}
inline int ny(int x)
{
   return ksm(x,mod-2);
}
inline int c(int n,int m)
{
   if(m==0||n==0)return 1;
   if(n<m)return 0;
   return jc[n]*ny(jc[m])%mod*ny(jc[n-m])%mod;
}
signed main()
{
   int n,m,aa,bb;
   cin>>n>>m>>aa>>bb;
   aa%=mod;bb%=mod;
   for(int i=1;i<=n;i++)scanf("%lld",&a[i]),a[i]%=mod;
   for(int i=1;i<=m;i++)scanf("%lld",&b[i]),b[i]%=mod;
   bit1[0]=bit2[0]=1;jc[0]=1;
   for(int i=1;i<=m;i++)bit1[i]=bit1[i-1]*aa%mod;
   for(int i=1;i<=n;i++)bit2[i]=bit2[i-1]*bb%mod;
   for(int i=1;i<=610000;i++)jc[i]=jc[i-1]*i%mod;
   int ans=0;
   for(int i=1;i<=n;i++)ans=(ans+a[i]%mod*(bit1[m]*bit2[n-i]%mod*c(n-i+m-1,m-1)%mod)%mod)%mod;//,cout<<ans<<" ";
   for(int i=1;i<=m;i++)ans=(ans+b[i]%mod*(bit2[n]*bit1[m-i]%mod*c(n-i+m-1,n-1)%mod)%mod)%mod;   
   cout<<ans;   
   return 0;   
}

顺便说一下,走一个n*m的矩阵,从一个角到另一个角
方案数为\(C_{n+m}^m\),格点边界注意一下就行
还有:能递推就不要递归!

T2.卡常题

一个很神奇的转换,X点其实是是点,y点其实是边。。。
于是这玩意就成了个环套树,求选代价最少的点,覆盖所有边
环套树套路是先找环,然后断一条边成树,两次树形dp,然后取min就行,dp挺好搞的不难

#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x;
}
const int N=1000050;
struct node{
	int from,to,next;
}a[2*N];
int head[N],mm=1;
inline void add(int x,int y)
{
	a[mm].from=x;a[mm].to=y;
	a[mm].next=head[x];head[x]=mm++;
}
int w[N],aa,bb;
int fa[N];
inline int find(int x)
{
	if(fa[x]!=x)fa[x]=find(fa[x]);
	return fa[x]; 
}
int px,py;bool v[N] ;
int f[N][2];//1选2不选 
inline void dfs(int x)
{
	v[x]=1;
	for(int i=head[x];i;i=a[i].next)
	{
		int y=a[i].to;
		if(v[y])continue;
		dfs(y);
		f[x][1]+=min(f[y][1],f[y][0]);
		f[x][0]+=f[y][1];
	}
	f[x][1]+=w[x];
}
signed main()
{
	int n;cin>>n>>aa>>bb;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=n;i++)
	{
	   int x,y;x=read();y=read();
	   w[x]+=aa;w[y]+=bb;
	   if(find(x)!=find(y))fa[find(y)]=x,add(x,y),add(y,x);
	   else px=x,py=y;
        }
        dfs(px);int ans=f[px][1];
        memset(f,0,sizeof(f));memset(v,0,sizeof(v));
        dfs(py);ans=min(ans,f[py][1]);
        cout<<ans;
        return 0;
}

T3.玄学题

乍一看是个挺离谱的式子,但实际上是纸老虎
底数是-1,那显然只看上面的一坨的奇偶就行
上面是一堆数的约数个数之和,但我们知道约数一般是成对出现的,所以个数一般是偶数个,加和肯定是偶数
有没有二班?完全平方数
所以只要找从\(1\times i\)到\(m\times i\)有多少个完全平方数就行了,对于m比较小的情况下可以枚举
m大了的时候,考虑完全平方数怎么出来的,i可以拆成
\(p\times q^2\),然后j就是\(p\times r^2\),于是对于每个i,有\(\sqrt{m/p}\)个j产生贡献,也就是r的数量
那唯一的问题就是咋求p,貌似可以线性筛
直接筛不太容易,你可以两个根号套一起,也是线性的

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=10000050;
int a[N];
vector <int> s;
signed main()
{
  int n,m;cin>>n>>m;
  for(int i=1;i<=sqrt(n);i++)s.push_back(i*i);
  for(int i=1;i<=n;i++)a[i]=i;
  for(int i=0;i<=s.size();i++)
  {
  	int p=s[i];
  	for(int j=1;i<=p;j++)
  	{
  	    if(p*j>n)break;
		a[p*j]=j;
	}
  }
  int ans=0;
  for(int i=1;i<=n;i++)
  {
    int p=m/a[i];
    int kk=floor(sqrt(p));
    if(kk&1)ans--;
    else ans++;
  }
  cout<<ans;
  return 0;
}

代码不长,重在思考

考试反思

1.一定不要懒,老老实实吧暴力打满了,别图省事
2.心态很重要,尤其是最后几分钟,自己一定不能慌,要保持头脑的清醒,精神要集中,否则犯的错更多
3.要培养转化问题的能力,往熟悉的方面转
4.不要因为不会就不敢想,思维一定要到

标签:13,ch,int,long,T1,模拟,times,考试,mod
来源: https://www.cnblogs.com/PMZG/p/15054741.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有