转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud
Programmers working on a large project have just received a task to write exactly m lines of code. There are n programmers working on a project, the i-th of them makes exactly ai bugs in every line of code that he writes.
Let's call a sequence of non-negative integers v1, v2, ..., vn a plan, if v1 + v2 + ... + vn = m. The programmers follow the plan like that: in the beginning the first programmer writes the first v1 lines of the given task, then the second programmer writes v2 more lines of the given task, and so on. In the end, the last programmer writes the remaining lines of the code. Let's call a plan good, if all the written lines of the task contain at most b bugs in total.
Your task is to determine how many distinct good plans are there. As the number of plans can be large, print the remainder of this number modulo given positive integer mod.
The first line contains four integers n, m, b, mod (1 ≤ n, m ≤ 500, 0 ≤ b ≤ 500; 1 ≤ mod ≤ 109 + 7) — the number of programmers, the number of lines of code in the task, the maximum total number of bugs respectively and the modulo you should use when printing the answer.
The next line contains n space-separated integers a1, a2, ..., an (0 ≤ ai ≤ 500) — the number of bugs per line for each programmer.
Print a single integer — the answer to the problem modulo mod.
3 3 3 100
1 1 1
10
3 6 5 1000000007
1 2 3
0
3 5 6 11
1 2 1
0
一个完全背包的问题,cf的3秒,果断上n^3dp
#include <iostream>
#include <sstream>
#include <ios>
#include <iomanip>
#include <functional>
#include <algorithm>
#include <vector>
#include <string>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <climits>
#include <cctype>
using namespace std;
#define XINF INT_MAX
#define INF 0x3FFFFFFF
#define MP(X,Y) make_pair(X,Y)
#define PB(X) push_back(X)
#define REP(X,N) for(int X=0;X<N;X++)
#define REP2(X,L,R) for(int X=L;X<=R;X++)
#define DEP(X,R,L) for(int X=R;X>=L;X--)
#define CLR(A,X) memset(A,X,sizeof(A))
#define IT iterator
typedef long long ll;
typedef pair<int,int> PII;
typedef vector<PII> VII;
typedef vector<int> VI;
ll dp[][];
ll a[];
int main()
{
ios::sync_with_stdio(false);
int n,m,b,MOD;
cin>>n>>m>>b>>MOD;
for(int i=;i<=n;i++){
cin>>a[i];
}
dp[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
for(int k=;k<=b;k++){
if(k>=a[i])
dp[j][k]+=dp[j-][k-a[i]];
dp[j][k]%=MOD;
}
} }
ll ans=;
for(int i=;i<=b;i++){
ans+=dp[m][i];
ans%=MOD;
}
cout<<ans<<endl;
return ;
}
The country has n cities and n - 1 bidirectional roads, it is possible to get from every city to any other one if you move only along the roads. The cities are numbered with integers from 1 to n inclusive.
All the roads are initially bad, but the government wants to improve the state of some roads. We will assume that the citizens are happy about road improvement if the path from the capital located in city x to any other city contains at most one bad road.
Your task is — for every possible x determine the number of ways of improving the quality of some roads in order to meet the citizens' condition. As those values can be rather large, you need to print each value modulo 1 000 000 007 (109 + 7).
The first line of the input contains a single integer n (2 ≤ n ≤ 2·105) — the number of cities in the country. Next line contains n - 1positive integers p2, p3, p4, ..., pn (1 ≤ pi ≤ i - 1) — the description of the roads in the country. Number pi means that the country has a road connecting city pi and city i.
Print n integers a1, a2, ..., an, where ai is the sought number of ways to improve the quality of the roads modulo 1 000 000 007 (109 + 7), if the capital of the country is at city number i.
3
1 1
4 3 3
5
1 2 3 4
5 8 9 8 5
树形dp
一开始看完D题,一想,这不是树形DP水题嘛,中间用个除法,逆元搞一搞就好了。。。然后就被petr给hack了。。。原因便是会发生除0的情况,于是,我们需要避免出现除法。
那么我们需要统计出不包括这个子树的,并且以其父亲为根的方案数。
#include <iostream>
#include <sstream>
#include <ios>
#include <iomanip>
#include <functional>
#include <algorithm>
#include <vector>
#include <string>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <climits>
#include <cctype>
using namespace std;
#define XINF INT_MAX
#define INF 0x3FFFFFFF
#define MP(X,Y) make_pair(X,Y)
#define PB(X) push_back(X)
#define REP(X,N) for(int X=0;X<N;X++)
#define REP2(X,L,R) for(int X=L;X<=R;X++)
#define DEP(X,R,L) for(int X=R;X>=L;X--)
#define CLR(A,X) memset(A,X,sizeof(A))
#define IT iterator
typedef long long ll;
typedef pair<int,int> PII;
typedef vector<PII> VII;
typedef vector<int> VI;
const ll MOD=;
ll dp[];
ll dp1[];
vector<int>G[];
ll dp2[];
ll pre[];
ll last[];
void dfs(int x){
dp[x]=;
for(int i=;i<G[x].size();i++){
int v=G[x][i];
dfs(v);
dp[x]=dp[x]*(dp[v]+)%MOD;
}
}
void dfs1(int x){
dp1[x]=dp[x]*dp2[x]%MOD;
pre[]=;
for(int i=;i<G[x].size();i++){
int v = G[x][i];
pre[i+]=pre[i]*(dp[v]+)%MOD;
}
last[(int)G[x].size()]=;
for(int i=(int)G[x].size()-;i>=;i--){
int v = G[x][i];
last[i]=last[i+]*(dp[v]+)%MOD;
}
for(int i=;i<G[x].size();i++){
int v = G[x][i];
dp2[v]=dp2[x]*pre[i]%MOD*last[i+]%MOD;
dp2[v]++;
}
for(int i=;i<G[x].size();i++){
int v = G[x][i];
dfs1(v);
}
}
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
int a;
for(int i=;i<=n;i++){
cin>>a;
G[a].PB(i);
}
fill(dp2,dp2+n+,);
dfs();
dfs1();
for(int i=;i<=n;i++)cout<<dp1[i]<<" ";
cout<<endl;
return ;
}