20160221模拟

来源:互联网 发布:凸包 最快算法 编辑:程序博客网 时间:2024/05/17 01:57

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)
注意mn级别以下才有解,否则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
原创粉丝点击