博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.8.15提高B组模拟考试
阅读量:5880 次
发布时间:2019-06-19

本文共 2418 字,大约阅读时间需要 8 分钟。

emmm...所以为什么出狱了还要做监狱的考试啊?

 

T1 题意简述:

 

Description

Input

Output

Data Constraint

 

   解题思路:dp。设dp[i][j]为用了i个弹珠,放进j个抽屉中的方案数。

             一开始我想到的dp转移方程是dp[i][j]=(k=1~i/j)dp[i-k][j-1]。

             然后我就兴致勃勃地交了上去,只拿了10分。凉凉。

             看题解说是和第二类斯特林数相似,好像没毛病。

             转移方程为dp{i}[j]=dp[i-1][j-1]+dp[i-j][j]。

#include
#include
#include
#include
#include
#include
#define MOD 998244353#define ll long longusing namespace std;ll n,m,ans,dp[5001][5001];int main(){ scanf("%lld%lld",&n,&m); dp[0][0]=1; for(ll i=1;i<=n;i++) for(ll j=1;j<=min(i,m);j++) dp[i][j]=(dp[i-1][j-1]+dp[i-j][j])%MOD; printf("%lld\n",dp[n][m]%MOD); return 0;}

 


 

T2 题意简述:

 

Description

Input

Output

Data Constraint

 

   解题思路:结论题。

             通过打表可以发现,当gcd(a,b)=a xor b时,a-b=gcd(a,b)=a xor b。

             因此只需枚举a-b的取值并计数即可。

#include
#include
#include
#include
#include
#include
using namespace std;int n,cnt[10000001];int main(){ scanf("%d",&n); for(int i=1;i<=10000000;i++) for(int j=i+i;j<=10000000;j+=i) if((j^(j-i))==i) cnt[j]++; for(int i=1;i<=10000000;i++) cnt[i]+=cnt[i-1]; printf("%d\n",cnt[n]); return 0;}

 


 

T3 题意简述:

 

Description

Input

Output

Data Constraint

 

   解题思路:点分治。

             一遍点分治计算出所有(S,E)取值范围内的路径,计算时更新答案即可。

             注意dis数组不必memset,也不必sort,否则会T得很惨。

#pragma GCC optimize(3)#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3fusing namespace std;set
st;int n,ans=INF,sta,end,cnt,head[100001];int mn,root,siz[100001],vis[100001],dis[100001],tot;struct uio{ int nxt,to,val;}edge[200001];void add(int x,int y,int z){ edge[++cnt].nxt=head[x]; edge[cnt].to=y; edge[cnt].val=z; head[x]=cnt;}void getroot(int x,int fa,int size){ siz[x]=1; int tmp=0; for(int i=head[x];i;i=edge[i].nxt) { int y=edge[i].to; if(y==fa||vis[y]) continue; getroot(y,x,size); siz[x]+=siz[y]; tmp=max(tmp,siz[y]); } tmp=max(tmp,size-siz[x]); if(tmp
=sta&&tmp<=end) ans=tmp; } for(int j=tot;j;j--) { if(dis[j]
=sta&&dis[j]<=end) ans=dis[j]; st.insert(dis[j]); } } for(int i=head[x];i;i=edge[i].nxt) { int y=edge[i].to; if(vis[y]) continue; mn=INF,getroot(y,0,siz[y]); dfs(root); }}int main(){ scanf("%d%d%d",&n,&sta,&end); for(int i=1;i

 

转载于:https://www.cnblogs.com/water-radish/p/9484345.html

你可能感兴趣的文章
==和equals区别
查看>>
2010技术应用计划
查看>>
XML 节点类型
查看>>
驯服 Tiger: 并发集合 超越 Map、Collection、List 和 Set
查看>>
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现...
查看>>
LeetCode – LRU Cache (Java)
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
如何将lotus 通讯簿导入到outlook 2003中
查看>>
WinForm 应用程序中开启新的进程及控制
查看>>
js replace,正则截取字符串内容
查看>>