Codeforces Round #144 (Div. 1) B dp
2015-04-20 22:09
337 查看
//第i列和第i+n的涂色个数是相同的,所以只需要处理前n列
//dp[i][j]表示前i列有j个涂色的方法数
//dp[i][j] += dp[i-1][s]*pow(c
[s] , m/n)
//c
[s] 表示从n个数中取s的组合数
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 110 ;
const __int64 mod = 1000000007;
__int64 dp[maxn][maxn*maxn];
__int64 c[maxn][maxn] ;
__int64 po[maxn][maxn*maxn][2] ;
__int64 pow(__int64 a ,__int64 b)
{
__int64 c = 1;
while(b)
{
if((b&1)) c=((c%mod)*(a%mod))%mod;
a=((a%mod)*(a%mod))%mod ;
b = b>>1;
}
return c;
}
void init()
{
memset(dp , 0 , sizeof(dp)) ;
for(int i = 0;i <= 100;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 ;
}
}
int main()
{
__int64 m ;
int n , k;
while(~scanf("%d%I64d%d",&n ,&m ,&k))
{
init();
int res = m%n ;
for(int i =0;i <= n ;i++)
dp[i][0] = 1 ;
for(int i = 1;i <= n;i++)
for(int s = 0;s <= k;s++)
{
if(i <= res)
po[i][s][0] = pow(c
[s] , m/n+1);
else
po[i][s][1] = pow(c
[s] ,m/n);
}
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= k;j++)
{
for(int s = 0;s <= min(j ,n); s++)
{
if(i <= res)
dp[i][j] = (dp[i][j] + dp[i-1][j-s]*po[i][s][0])%mod ;
else
dp[i][j] = (dp[i][j] + dp[i-1][j-s]*po[i][s][1])%mod ;
}
}
}
printf("%I64d\n" ,dp
[k]) ;
}
return 0;
}
//dp[i][j]表示前i列有j个涂色的方法数
//dp[i][j] += dp[i-1][s]*pow(c
[s] , m/n)
//c
[s] 表示从n个数中取s的组合数
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 110 ;
const __int64 mod = 1000000007;
__int64 dp[maxn][maxn*maxn];
__int64 c[maxn][maxn] ;
__int64 po[maxn][maxn*maxn][2] ;
__int64 pow(__int64 a ,__int64 b)
{
__int64 c = 1;
while(b)
{
if((b&1)) c=((c%mod)*(a%mod))%mod;
a=((a%mod)*(a%mod))%mod ;
b = b>>1;
}
return c;
}
void init()
{
memset(dp , 0 , sizeof(dp)) ;
for(int i = 0;i <= 100;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 ;
}
}
int main()
{
__int64 m ;
int n , k;
while(~scanf("%d%I64d%d",&n ,&m ,&k))
{
init();
int res = m%n ;
for(int i =0;i <= n ;i++)
dp[i][0] = 1 ;
for(int i = 1;i <= n;i++)
for(int s = 0;s <= k;s++)
{
if(i <= res)
po[i][s][0] = pow(c
[s] , m/n+1);
else
po[i][s][1] = pow(c
[s] ,m/n);
}
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= k;j++)
{
for(int s = 0;s <= min(j ,n); s++)
{
if(i <= res)
dp[i][j] = (dp[i][j] + dp[i-1][j-s]*po[i][s][0])%mod ;
else
dp[i][j] = (dp[i][j] + dp[i-1][j-s]*po[i][s][1])%mod ;
}
}
}
printf("%I64d\n" ,dp
[k]) ;
}
return 0;
}
相关文章推荐
- Codeforces Round #144 (Div. 1), problem: (B) Table DP 组合数学
- Codeforces Round #287 (Div. 2) E. Breaking Good(最短路、dp)
- Codeforces Round #396(Div. 2)C. Mahmoud and a Message【dp】
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp
- Codeforces Round #367 (Div. 2) C. Hard problem (dp)
- Codeforces Round #105 (Div. 2) D 概率DP
- Codeforces Round #290 (Div. 2) D. Fox And Jumping dp
- Codeforces Round #336 (Div. 2) 608D Zuma(dfs+dp)
- Codeforces Round #302 (Div. 2) C 简单dp
- Codeforces Round #144 (Div. 2) A. Perfect Permutation
- Codeforces Round #144 (Div. 2) C. Cycles
- Codeforces Round #284 (Div. 2): D. Name That Tune(概率DP)
- Codeforces Round #301 (Div. 2)D (概率dp)
- Codeforces Round #264 (Div. 2)D(图论+dp)
- Codeforces Round #293 (Div. 2) -- D. Ilya and Escalator (DP)
- Codeforces Beta Round #61 (Div. 2) B. Petya and Countryside (DP)
- Codeforces Round #382 (Div. 1) C. Ostap and Tree(树形DP)
- Codeforces Round #274 Div.1 C Riding in a Lift --DP
- E. Vladik and cards Codeforces Round #384 (Div. 2) 好题 二分+(贪心+状态压缩DP)判断
- DP Codeforces Round #260 (Div. 1) A. Boredom