新生赛及预选赛 10

新生赛及预选赛 10

这个和昨天的不太一样,但只做了四道题,昨天有点小摆

A

还是很清晰的一个模拟题,预处理的时候判断一下,在询问的时候二分查找就可以了。

Code

B

k 个数组 ,记从每个数组的 a[i] 个人中共选出 x 个人的方案数为 f(x) (不能全都不选,也就是 x>0 )。

x=1pf(x)

B 题就是这个题在 k=2 时候的简单版本,很明显直接人肉枚举情况就可以通过了。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MOD=13331;
int n,m,p;
int C[1010][1010];
inline void pre()
{
cin>>n>>m>>p;
for(int i=0;i<=1000;++i)
{
C[i][0]=1;
for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
}
inline void solve()
{
int ans=0;
for(int i=0;i<=min(n,p);++i)
for(int j=0;j<=m&&(i+j<=p);++j)
ans+=1ll*C[n][i]*C[m][j]%MOD,ans%=MOD;
cout<<ans-1;
}
signed main()
{
pre();
solve();
return 0;
}

C

C 题就是 B 题的原版描述,个人写了个 DP ,大概思路是:定义 dp[i][j] 为,前 i 个数组,选了 j 个人的方案数。

那么转移方程其实也很明显:

for(register int i=1;i<=n;++i)
{
for(register int j=0;j<=p;++j)
{
for(register int x=0;x<=min(j,a[i]);++x)
{
dp[i][j]+=dp[i-1][j-x]*C(a[i],x);
}
}
}

但是可惜的是这道题的数据范围十分的大, kai106 ,上述方法明显具有正确性,但是无法通过该题目。

点击查看代码

D

不会

E

给出若干个数字,已知这些数字是若干个未知数字的因数(可重),求出这若干个未知数字。

很明显的是我们从最大的数开始枚举,然后剔除它所有的因数,直到集合里再也没有数字即可。

这里用了个 multiset 实现,剔除操作是 wipe() 函数。

数据范围很小,随便怎么做应该都能过。

Code

posted @   Hanggoash  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
动态线条
动态线条end
点击右上角即可分享
微信分享提示