20160221模拟

T1

题目大意

给定 n,m,d
询问满足以下条件的序列的方案数
对于序列 {A} 满足

  • Ai1<AiAiAi1<=d
  • Ai=n
  • A1[0,d]
题解

AB>=1<=d,dp[i,j]i,Aj
dp[i,j]=dk=1dp[i1,j(mi+1)k]
这样是 O(nmd) 的复杂度
每次转移都是类似的所以我们用个辅助数组 F[i]=dp[i,j 优化转移
复杂度 O(nm)
注意 m n级别以下才有解,否则ans=0

const
    maxn=300005;
    mmod=1000000007;
var
    dp:array[0..1,0..maxn]of longint;
    f:array[0..maxn]of longint;
    i,j,k:Longint;
    n,m,t,s,a:longint;
begin
    readln(n,m,t); s:=0;
    for i:=1 to m do inc(s,i);
    if s>n then begin writelN(0); halt; end;
    for i:=0 to n do dp[0,i]:=0;
    dp[0,0]:=1;
    a:=0;
    for i:=1 to m do
        begin
            for j:=0 to n do dp[1-a,j]:=0;
            for j:=0 to m-i+1 do f[j]:=0;
            for j:=0 to n do
                begin
                    dp[1-a,j]:=f[j mod (m-i+1)];
                    f[j mod (m-i+1)]:=(f[j mod (m-i+1)]+dp[a,j])mod mmod;
                    if j-(m-i+1)*t>=0 then f[j mod (m-i+1)]:=(f[j mod (m-i+1)]+(mmod-dp[a,j-(m-i+1)*t]))mod mmod;
                end;
            a:=a xor 1;
        end;
    writeln(dp[a,n]);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值