bzoj3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——递推 / 组合数
2024-08-27 06:54:14
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398
对于这种有点巧妙的递推还是总是没有思路...
设计一个状态 f[i] 表示第 i 位置上是公牛,那么 f[i] = ∑(0<=j<i-k) f[j];
再前缀和优化一下即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=1e5+,mod=;
int n,k,f[maxn],s[maxn];
int main()
{
scanf("%d%d",&n,&k);
f[]=;s[]=;
for(int i=;i<=n;i++)
{
f[i]=(s[max(,i-k-)])%mod;
s[i]=(s[i-]+f[i])%mod;
}
printf("%d",s[n]);
return ;
}
当然也可以用组合数:https://www.cnblogs.com/harden/p/6286182.html
(注意取模与 (ll) 与加括号的艺术...)
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll ans;
int n,k,mod=;
int pw(int a,int b)
{
int ret=;
for(;b;b>>=,a=((ll)a*a)%mod)
if(b&)ret=((ll)ret*a)%mod;
return ret;
}
int C(int n,int m)
{
int a=,b=;
for(int i=n-m+;i<=n;i++) a=((ll)a*i)%mod;
for(int i=;i<=m;i++) b=((ll)b*i)%mod;
return ((ll)a*pw(b,mod-))%mod;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
int m=n-(i-)*k;
if(m<i)break;
ans=((ll)ans+C(m,i))%mod;
}
printf("%d",ans%mod);
return ;
}
最新文章
- CSS系列:CSS的继承与层叠特性
- 11.Configure Many-to-Many(配置多对多关系)【Code-First系列】
- 【转】 TechED2010与我(三) —— 初识云计算
- PerfMap – 显示前端网站性能的热力图插件
- ASP代码审计一枚
- C# WebApi传参之Get请求-AJAX
- POJ 2385 Apple Catching
- setTimeOut传参数(转)
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】
- [转载]typedef常见用法
- Python入门教程(2)
- Apache和PHP环境配置
- UVa 725 简单枚举+整数转换为字符串
- Docker for Web Developers目录
- IIS前端页面不显示详细错误解决方法
- python验证码识别接口及识别思路代码
- firefox镜像 和geckodriver驱动大全
- RFID系统 免费开源代码 开发,分享[申明:来源于网络]
- WPF中反转3D列表项
- Java基础—线程