求调70pts,后面的T了,O2能过(作业不能开O2
查看原帖
求调70pts,后面的T了,O2能过(作业不能开O2
756684
寄风孤影楼主2023/7/5 17:27

RT,人崩溃了

代码:

#include <bits/stdc++.h>
using namespace std;
namespace IO {
	#if ONLINE_JUDGE
	#define getc() (IS == IT && (IT = (IS = ibuf) + fread(ibuf, 1, IL, stdin), IS == IT) ? EOF : *IS++)
	#else
	#define getc() getchar()
	#endif
	const int IL = 1 << 20, OL = 1 << 20;
	int olen = 0;
	char ibuf[IL], *IS = ibuf, *IT = ibuf, obuf[OL];
	inline int read() {
		register char ch = getc(); register int x = 0, f = 1;
		while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getc(); }
		while(isdigit(ch)) x = x * 10 + ch - 48, ch = getc();
		return x * f;
	}
	inline double readdb() {
		register char ch = getc(); register double x = 0, f = 1;
		while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getc(); }
		while(isdigit(ch)) x = x * 10 + ch - 48, ch = getc();
		if(ch == '.') {
			register double b = 0.1;
			ch = getc();
			while(isdigit(ch)) x += (ch - 48) * b, b *= 0.1, ch = getc();
		}
		return x * f;
	}
	inline int readstr(char *s) {
		register char ch = getc(); register int len = 0;
		while(!isalpha(ch)) ch = getc();
		while(isalpha(ch)) s[++len] = ch, ch = getc();
		return len;
	}
	inline void flush() { fwrite(obuf, 1, olen, stdout); olen = 0; }
	inline void putc(register char ch) { obuf[olen++] = ch; }
	template<class T>
	inline void print(register T x) {
		if(x < 0) obuf[olen++] = '-', x = -x;
		if(x > 9) print(x / 10);
		obuf[olen++] = x % 10 + 48;
	}
} using namespace IO;
#define ll long long
const int mod = 1e9 + 7;
struct node{
	int to , nxt; 
} a[1000005];
int head[100005];
inline void add(int id , int u , int v){
	a[id].nxt = head[u];
	a[id].to = v;
	head[u] = id;
}
int cntt;
//vector <int> a[100005];
int dp[100005][105][2][2] , ans[105][2][2] , cnt[1000005] , n , k;
inline void dfs(int now , int fa = -1){
	dp[now][0][0][0] = dp[now][1][1][0] = cnt[now] = 1; 
	for(int i = head[now];i > 0;i = a[i].nxt){
		int v = a[i].to;
		if(v != fa){
			dfs(v , now);
			int all = min(cnt[now] + cnt[v] , k);
			for(int cntnow = 0;cntnow <= cnt[now];cntnow++){
				for(int cntv = 0;cntv <= cnt[v] && cntnow + cntv <= all;cntv++){
					for(int p1 = 0;p1 <= 1;p1++){
						for(int q1 = 0;q1 <= 1;q1++){
							for(int p2 = 0;p2 <= 1;p2++){
								for(int q2 = 0;q2 <= 1;q2++){
									if(q2 | p1){
										ans[cntnow + cntv][p1][q1 | p2] += (1ll * dp[now][cntnow][p1][q1] * dp[v][cntv][p2][q2]) % mod;
										if(ans[cntnow + cntv][p1][q1 | p2] > mod) ans[cntnow + cntv][p1][q1 | p2] -= mod;
									}
								}
							}
						}
					}
				}
			}
			for(int i = 0;i <= all;i++){
				for(int p = 0;p <= 1;p++){
					for(int q = 0;q <= 1;q++){
						dp[now][i][p][q] = ans[i][p][q];
					}
				}
			}
			for(int i = 0;i <= all;i++){
				ans[i][0][0] = ans[i][0][1] = ans[i][1][0] = ans[i][1][1] = 0;
			}
			cnt[now] = all;
		}
	}
}
int main(){
	n = read() , k = read();
	for(int i = 1;i < n;i++){
		int u = read() , v = read();
		add(++cntt , u , v);
		add(++cntt , v , u);
	}
	dfs(1);
	int ans = (dp[1][k][0][1] + dp[1][k][1][1]) % mod;
	print(ans);
	flush();
	return 0;
}
2023/7/5 17:27
加载中...