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年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶...