20210713考试-2021noip13
这位巨佬的博客还是比我好多了
T1 工业题
考场:
暴力挺香的,不想正解了。
题解:
$f(i,j)$ 只会得到 $f(i-1,j)$ 和 $f(i,j-1)$ 的贡献。每向右一步乘 $a$ ,向下一步乘 $b$ 。左侧竖点有$\binom{n+m-1-i}{m-1}$种走法,上侧横店有$\binom{n+m-1-i}{n-1}$种走法.
预处理阶乘和阶乘逆元以及 $a,b$ 的幂次方即可。
#include<bits/stdc++.h>
using namespace std;
const int N=11000000,mod=998244353;
long long a,b,n,m,inc[N],jc[N],am[N],bm[N],fheng[N],fshu[N],ans;
long long quick_pow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y&1)
{
res=res*x%mod;
}
y>>=1;
x=x*x%mod;
}
return res;
}
long long C(int n,int m)
{
return jc[n]*inc[m]%mod*inc[n-m]%mod;
}
int main()
{
scanf("%lld%lld%lld%lld",&n,&m,&a,&b);
a%=mod;b%=mod;
am[0]=bm[0]=jc[0]=inc[0]=1;
for(int i=1;i<=n+m;i++)
{
jc[i]=jc[i-1]*i%mod;
am[i]=am[i-1]*a%mod;
bm[i]=bm[i-1]*b%mod;
}
inc[n+m]=quick_pow(jc[n+m],mod-2);
for(int i=n+m-1;i>=1;i--)
{
inc[i]=inc[i+1]*(i+1)%mod;
}
for(int i=1;i<=n;i++)
{
scanf("%lld",&fheng[i]);fheng[i]%=mod;
}
for(int i=1;i<=m;i++)
{
scanf("%lld",&fshu[i]);fshu[i]%=mod;
}
for(int i=1;i<=n;i++)
{
ans+=fheng[i]*C(n+m-1-i,m-1)%mod*am[m]%mod*bm[n-i]%mod;
ans%=mod;
}
for(int i=1;i<=m;i++)
{
ans+=fshu[i]*C(n+m-1-i,n-1)%mod*am[m-i]%mod*bm[n]%mod;
ans%=mod;
}
printf("%lld\n",ans);
return 0;
}
T2 卡常题
考场:
灵光乍现,发现如果把y部点删去,只剩下每个y点所连的边,题目所给的图就变成了一棵基环树。
原因:x,y部点都只有 $n$ 个如果把y点变成 $n$ 条边,那么由于题目保证联通且无重边,$n-1$ 的边构成一棵树,剩下的一条边随机连接,构成环。
问题就转化成了,在一棵基环树上,选择一个点的代价为该点所连边的权值和,选择的点可以“看守”所连的边,求所有边被看守的最小代价。
题解:
考场上我按照轮流断掉环中的每一条边,每次跑 $O(n)$ 树形DP来做的,即使看到能被卡成 $O(n^2)$ 的环形数据,依然执迷不悟。
事实上断哪一条边对答案完全没有影响,因为DP所求的和所需的完全没有变。 而且如果随机选一个点作为树根,难以保证断掉的边两侧的点一定选择了之一。
所以钦定其中一个点为根,跑两次DP。
#include<bits/stdc++.h>
using namespace std;
const int N=1100000,M=N<<1;
int n,aa,bb,cnt=1,head[N],circle[N<<1],num,c1,c2,du[N],e,f[2][N][2],ans=0x7fffffff,sam[N];
bool vis[N],used[N];
inline int read()
{
int s=0,w=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
inline int _min(int a,int b)
{
return a<b?a:b;
}
struct bian
{
int nxt,to,w[2];
}b[M];
void add(int from,int to,bool g)
{
du[from]++;du[to]++;
b[++cnt].w[g]=aa;
b[cnt].w[g^1]=bb;
b[cnt].nxt=head[from];
b[cnt].to=to;
head[from]=cnt;
}
void findcir1(int u,int fa)
{
vis[u]=1;
for(int i=head[u],v;i;i=b[i].nxt)
{
v=b[i].to;
if(v==fa) continue;
else if(vis[v])
{
c1=u,c2=v;e=i;
return;
}
else
{
findcir1(v,u);
}
}
}
bool findcir2(int u)
{
bool ok=0;
for(int i=head[u],v;i;i=b[i].nxt)
{
if(used[i])
continue;
v=b[i].to;
circle[++num]=i;
circle[++num]=i^1;
used[i]=used[i^1]=1;
if(du[v]==2)
{
circle[num--]=0;
circle[num--]=0;
continue;
}
if(v==c1)
{
ok=1;return ok;
}
ok=findcir2(v);
if(!ok)
{
circle[num--]=0;
circle[num--]=0;
continue;
}
else
return ok;
}
return ok;
}
void DP(int x,int fa,int o)
{
int sum=0;
f[o][x][0]=0;
f[o][x][1]=sam[x];
for(int i=head[x];i;i=b[i].nxt)
{
if(i==e||(i^1)==e||b[i].to==fa)continue;
DP(b[i].to,x,o);
sum+=min(f[o][b[i].to][0],f[o][b[i].to][1]);
f[o][x][0]+=f[o][b[i].to][1];
}
f[o][x][1]+=sum;
}
int main()
{
n=read();aa=read();bb=read();
for(int i=1,u,v;i<=n;i++)
{
u=read();v=read();
add(u,v,0);
add(v,u,1);
sam[u]+=aa;
sam[v]+=bb;
}
findcir1(1,0);
findcir2(c1);
memset(used,0,sizeof(used));
DP(c1,0,0);
DP(c2,0,1);
printf("%d\n",_min(f[0][c1][1],f[1][c2][1]));
return 0;
}
T3 玄学题
$\begin{align}ans=\sum_{i=1}^{n}(-1)^{\sum_{j=1}^{m}d(i*j)}\\ans=\sum_{i=1}^{n}(-1)^{\sum_{j=1}^{m}d(i*j) \bmod 2}\end{align}$
因为奇+奇=偶,奇+偶=偶,偶+偶=偶,
所以,只有 $d(i*j)$ 为奇数,才对和式整体有贡献。
这时 $i*j$ 为完全平方数,假设i=p*q*q,那么 $j$ 是 $p*r*r$。
对于每一个 $i$,有$\sqrt{\lfloor \frac{m}{p} \rfloor}$ 个j对和式产生了贡献。
(只有能使 $-1$ 的幂增减 $1$ 的才算对和式产生了贡献)
#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
long long s=0,w=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
const int N=11000000;
long long n,m,ans,p[N];
bool flag[N];
int main()
{
n=read();m=read();
scanf("%lld%lld",&n,&m);
for(int i=1;i*i<=n;i++)
{
for(int j=1;j*i*i<=n;j++)
{
p[i*i*j]=j;
}
flag[i*i]=1;
}
int s=sqrt(m);
for(int i=1;i<=n;i++)
{
if(flag[i])
{
if(s&1)
ans--;
else
ans++;
}
else
{
int x=sqrt(m/p[i]);
if(x&1)
ans--;
else ans++;
}
}
printf("%lld\n",ans)
;
return 0;
}
这两场都好拉跨啊QWQ每一次就离正解一步之遥。
20210713考试-2021noip13的更多相关文章
- 20210713考试-2021noip14
T1 队长快跑 #include<bits/stdc++.h> using namespace std; const int N=1e6+5,INF=0x7fffffff; int n,a ...
- 全网独家MongoDB Certified DBA Associate考试认证视频
该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...
- 记lrd的高二上学期第五次调研考试
河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...
- 1009: [HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...
- mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风
(-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...
- js封装用户选项传递给Servlet之考试系统二
<%@ page language="java" import="java.util.*" contentType="text/html; ch ...
- js动态生成选项之考试系统(一)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- 分享一个LiteDB做的简单考试系统辅助工具
凌晨,被安排在公司值班,因为台风“灿鸿”即将登陆,风力太大,办公楼,车间等重要部分需要关注.所以无聊,那就分享一下,今天给朋友临时做的一个小的考试系统辅助工具吧.其实非常小,需求也很简单,但是可以根据 ...
- CCF考试
第八次CCF考试记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四题的代码 第 ...
随机推荐
- etcd raft 处理流程图系列1-raftexample
最近在看raft相关的代码和实现,发现etcd的raft模块在实现上还是比较灵活的,但缺点就是需要用户实现比较多的功能,如存储和网络等,同时带来的优点就是不会对用户的存储和传输作限制.网上对该模块的描 ...
- 创建函数function
1.创建普通函数 function 函数名称(){ 函数体://封装的代码 } 函数名称()://调用函数 function getSum(){ for(var i=1,sum=0;i<=100 ...
- Redis 实战篇:巧用数据类型实现亿级数据统计
在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合,同时还要对集合中的数据进行统计排序. 常见的场景如下: 给一个 userId ,判断用户登陆状态: 两亿用户最近 7 ...
- iptables中实现内外网互访,SNAT和DNAT
目录 一.SNAT原理与应用 二.DNAT原理与应用 DNAT转换:发布内网web服务 DNAT转换:发布时修改目标端口 三.防火墙规则的备份和还原 四.linux抓包 一.SNAT原理与应用 ① S ...
- 密码三次就会锁掉 while 循环
while 只要给定的条件为真,C 语言中的 while 循环语句会重复执行一个目标语句 一般定义 //return_type function_name( parameter list ) //{ ...
- 针对Cloud-init的可行性报告
by hyc 针对Cloud-init的可行性报告 一.Cloud-init研究进展: (1)ubuntu镜像: 已在版本为ubuntu-server-14.04-amd64上实现了修改主机名和用户密 ...
- 天梯赛 L2-008 最长对称子串
题目是PTA的天梯赛练习集中的L2-008 https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 ...
- alpakka-kafka(8)-kafka数据消费模式实现
上篇介绍了kafka at-least-once消费模式.kafka消费模式以commit-offset的时间节点代表不同的消费模式,分别是:at-least-once, at-most-once, ...
- CYPEESS USB3.0程序解读之---同步FIFO(slaveFifoSync)
上一篇文章解读了CYPRESS FX3的GPIO的操作过程,下面解读同步FIFO的一个例子(slaveFifoSync). *生产者,消费者. 1.首先看DMA的回调函数(cyu3dma.h): ty ...
- 【笔记】numpy.array基础(3)
numpy数组的合并与分割 合并操作 concatenate拼接,只能操作维数一样的数据 且并不局限于两个元素 对于二维数组来说,可以通过控制axis来控制是按照行还是按照列来进行拼接操作,默认为ax ...