BZOJ3398 [Usaco 2009 Feb] Bullcow 목소와 암소

태그: DP, 콤보 수학
Time Limit: 1 Sec  Memory Limit: 128MB Submit: 335  Solved: 235 [Submit][Status][Discuss]
Description
존은 N(1≤N≤100000)마리의 소를 데리고 집회의 전시 행사에 참가하려고 한다. 이 소들은 암소일 수도 있고 암소일 수도 있다. 소들은 일렬로 서야 한다. 그러나 암소는 싸움을 좋아하기 때문에 암소가 소동을 일으키지 않도록 존은 임의의 두 마리 암소 사이에 적어도 K(O≤K마리의 암소가 있어야 한다고 결정했다.
모두 몇 가지 줄을 서는 방법이 있는지 계산해 보세요. 모든 암소는 똑같다고 볼 수 있고, 모든 암소도 똑같습니다. 답은 5000011에 대한 모범입니다.
Input
한 줄에 두 개의 정수 N과 K를 입력합니다.
Output
줄을 서는 방법의 수를 나타내는 정수.
Sample Input
    4  2
Sample Output
    6
샘플 설명
6가지 방법은 암컷, 암컷, 암컷, 암컷, 암컷, 암컷
 
DP 누드 문제, 일거수일투족
F[i]=f[i-1]+f[i-k-1]
충격!hzwer가 기괴한 조합 수학으로 쓰다니.
 
Code
#include
#include
#include
#include
#include
#include
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define mem(x,num) memset(x,num,sizeof x)
#define LL long long
using namespace std;
inline LL read()
{
	LL f=1,x=0;char ch=getchar();
	while(ch'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
const int maxn=1e7+6,mod=5000011;
int n,k,f[maxn];
int main()
{
	n=read(),k=read();
	f[1]=2;
	k++;
	rep(i,2,n)f[i]=(f[i-1]+(i>k?f[i-k]:1))%mod;
	cout<

좋은 웹페이지 즐겨찾기