标签:des blog http java os strong io for
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 157 Accepted Submission(s): 39
说是送分题,真是忧伤,,,,
送分应该就是送罚时把==
算是状态dp吧
dp[i] 表示 i 状态下的方案数。
i 化为二进制时 ,第一位为 1 表示有和为1 的存在,0表示没有,第二位为 1 时表示有和为 2的存在
第三位为 1 时表示有和为 3的存在...
转移:sta = i|(1<<(k-1))|(i<<j&m) ;
表示 i 的状态转移到了 sta状态
假如当前的状态 为 3 二进制就是 11,表示有和为 1,2的存在,
如果加上 3 ,那么 3 的状态就可以达到,也就是 |(1<<(3-1))
还有3可以和1,2加,也就是 原来的加上 3 ,也就是左移 3 位 |(i<<j)&m
因为大于 k的和我们是不在意的,所以最大的状态就是 (1<<k)-1 ;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define maxn 100010
#define mod 1000000007
#define LL long long
using namespace std;
int dp[(1<<20)+10] ;
int main()
{
int i ,n,m,k,j ;
int T ,L ;
cin >> T ;
while( T-- )
{
scanf("%d%d%d",&n,&k,&L) ;
memset(dp,0,sizeof(dp)) ;
dp[0]=1 ;
m = (1<<k)-1 ;
int tot = 0 ;
if(L > k)
{
tot = L-k ;
L = k ;
}
while(n--)
{
for( i = m ; i >= 0 ;i--)
{
if(dp[i]==0) continue ;
j = dp[i] ;
LL tmp = (LL)tot*dp[i]%mod ;
for( int u = 1 ; u <= L ;u++)
{
int sta = (i|(1<<(u-1))|((i<<u)&m)) ;
dp[sta] += j ;
dp[sta] %= mod;
}
dp[i] = (dp[i]+tmp)%mod ;
}
}
LL ans = 0 ;
for( i = 0 ; i <= m ;i++)
if((i>>(k-1))&1)
{
ans = (ans+dp[i])%mod ;
}
cout << ans << endl;
}
return 0 ;
}
hdu 4906 Our happy ending,布布扣,bubuko.com
标签:des blog http java os strong io for
原文地址:http://www.cnblogs.com/20120125llcai/p/3883896.html