import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Main{
static int N = 300,idx = 0,Q = 1000000007,count = 0;
static int h[] = new int[N];
static int e[] = new int[N*2];
static int ne[] = new int[N*2];
static long w[] = new long[N];
static boolean st[] = new boolean[N];
static Set<String> set = new HashSet<String>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
br.readLine();
int T = 10;
while(T-->0) {
idx = 0;
Arrays.fill(h, -1);
Arrays.fill(e, 0);
Arrays.fill(ne, 0);
Arrays.fill(w, 0);
Arrays.fill(st, false);
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]);//节点
int m = Integer.parseInt(s[1]);//操作
int l = Integer.parseInt(s[2]);
int r = Integer.parseInt(s[3]);//l~~r
String[] sa = br.readLine().split(" ");
for(int i = 1 ; i <= n ; i++ ) w[i] = Integer.parseInt(sa[i-1]);
String[] sc = br.readLine().split(" ");
for(int i = 2; i <= n ; i++) {
int j = Integer.parseInt(sc[i-2]);
add(i,j);add(j,i);
}
while(m-->0) {//m个操作
String[] sm = br.readLine().split(" ");
int a = Integer.parseInt(sm[0]);
int b = Integer.parseInt(sm[1]);
int c = Integer.parseInt(sm[2]);
w[a] = (w[a]+c)%Q;
st[a] = true;
wDfs(a,b,c);
Arrays.fill(st, false);
long res = 0;
for(int k = l; k <= r; k++) {
set.clear();
for(int i = 1; i <= n ; i++) {
ArrayList<String> sb = new ArrayList<String>();
sb.add(i+"");
st[i] = true;
res = (res + sDfs(i,k-1,w[i],sb))%Q;
st[i] = false;
}
}
bw.write(res+"\n");
}
bw.flush();
}
}
private static long sDfs(int u, int k, long sw, ArrayList<String> sb) {
if(k==0) {//
String s = get1(sb);
if(!set.contains(s.toString())) {
s = get2(sb);
set.add(s);
return sw;
}
return 0;
}
long res = 0;
for(int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];//u的邻点j
if(st[j]) continue;
st[j] = true;
sb.add(j+"");
res = (res + sDfs(j,k-1,(sw+w[j])%Q,sb))%Q;
st[j] = false;
sb.remove(sb.size()-1);
}
return res;
}
private static String get2(ArrayList<String> sb) {//逆序
String res = "";
for(int i = sb.size()-1; i >=0 ; i--) {
res += sb.get(i);
}
return res;
}
private static String get1(ArrayList<String> sb) {//正序
String res = "";
for(int i = 0; i <sb.size() ; i++) {
res += sb.get(i);
}
return res;
}
private static boolean wDfs(int a, int b, int c) {
if(a==b) return true;
for(int i = h[a]; i !=-1; i = ne[i]) {
int j = e[i];//与a的邻点
if(st[j]) continue;
st[j] = true;
w[j] = (w[j]+c)%Q;
if(wDfs(j,b,c)) return true;
w[j] = (Q+w[j]-c)%Q;
st[j] = false;
}
return false;
}
private static void add(int a, int b) {
e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
}
CCF二次求和(JAVA 继续混分 20分)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 给定某数字AA(1\le A\le 91≤A≤9)以及非负整数NN(0\le N\le 1000000≤N≤100...
- 练习4-11 统计素数并求和 (20 分) 1. 题目摘自 https://pintia.cn/problem-s...
- 实验4-1-7 特殊a串数列求和 (20 分) 1. 题目摘自 https://pintia.cn/problem...
- 【蝴蝶效应】 蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶...