第二屆CCPC女生賽 粗略題解(要做重現的不要看哦)

因爲再不全力投入華爲軟件精英挑戰賽就來不及了!

而且直播時講過題了,所以只能粗略寫一個題解,希望大家包涵>.<

基本可以參考代碼,可以畫圖模擬加思考腦補其原理與過程23333~~

會後續有人寫題解的啦!感謝參加經費、人員都不足的第二屆CCPC女生賽! 希望明年我也有機會參賽!

06是claris的防AK題,雖然我試圖幾次想要說服換掉這題。想補的可以找claris或者等幾天2333


PS:預測全對



PS2:我真的不會說話和撩妹啊哈哈哈哈          T_____________________________________T



【2017CCPC女生賽 A】【水題 模擬】Automatic Judge

Automatic Judge

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
Welcome to HDU to take part in the second CCPC girls’ competition!
A new automatic judge system is used for this competition. During the five-hour contest time, you can submit your code to the system, then the judge will reply you. Here is a list of the judge's replies and their meaning:

1. Accepted(AC): Yes, your program is correct. You did a good job!

2. PresentationError(PE) : Your program's output format is not exactly the same as required by the problem, although the output is correct. This usually means the existence of omitted or extra blank characters (white spaces, tab characters and/or new line characters) between any two non-blank characters, and/or blank lines (a line consisting of only blank characters) between any two non-blank lines. Trailing blank characters at the end of each line and trailing blank lines at the of output are not considered format errors. Check the output for spaces, blank lines, etc. against the problem's output specification.

3. WrongAnswer(WA) : Correct solution not reached for the inputs. The inputs and outputs that we use to test the programs are not public (it is recomendable to get accustomed to a true contest dynamic :-)

4. RuntimeError(RE) : Your program failed during the execution and you will receive the hints for the reasons.

5. TimeLimitExceeded(TLE) : Your program tried to run during too much time.

6. MemoryLimitExceeded(MLE): Your program tried to use more memory than the judge default settings.

7. OutputLimitExceeded(OLE): Your program tried to write too much information. This usually occurs if it goes into a infinite loop.

8. CompilationError(CE): The compiler fails to compile your program. Warning messages are not considered errors. Click on the judge's reply to see the warning and error messages produced by the compiler.

For each submission, if it is the first time that the judge returns ``AC'' on this problem, then it means you have passed this problem, and the current time will be added to the penalty of your team. In addition, every time you pass a problem, each unsuccessful try for that problem before is counted as 20 minutes penalty, it should also be added to the penalty of your team.
Now given the number of problems in the contest and the submission records of a team. Please write a program to calculate the number of problems the team passed and their penalty.
 

Input
The first line of the input contains an integer T(1T20), denoting the number of test cases.
In each test case, there are two integers n(1n13) and m(1m100) in the first line, denoting the number of problems and the number of submissions of a team. Problems are labeled by 1001, 1002, ..., 1000+n.
In the following m lines, each line contains an integer x(1001x1000+n) and two strings t(00:00t05:00) and s, denoting the team submits problem x at time t, and the result is st is in the format of HH:MM, while s is in the set \{AC, PE, WA, RE, TLE, MLE, OLE\}. The team is so cautious that they never submit a CE code. It is guaranteed that all the t in the input is in ascending order and every t is unique.
 

Output
For each test case, print a single line containing two integers A and B, denoting the number of problems the team passed and the penalty.
 

Sample Input
1 3 5 1002 00:02 AC 1003 00:05 WA 1003 00:06 WA 1003 00:07 AC 1002 04:59 AC
 

Sample Output
2 49

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 0, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int n, m;
int cnt[20], ac[20];
int main()
{
	scanf("%d", &casenum);
	for (casei = 1; casei <= casenum; ++casei)
	{
		scanf("%d%d", &n, &m);
		MS(cnt, 0); MS(ac, 0);
		int num = 0;
		int ans = 0;
		for (int i = 1; i <= m; ++i)
		{
			int o, hh, mm; char s[10];
			scanf("%d%d:%d%s", &o, &hh, &mm, s);
			o -= 1000;
			if (!strcmp(s, "AC") && !ac[o])
			{
				ans += cnt[o] * 20 + hh * 60 + mm;
				ac[o] = 1;
				++num;
			}
			else ++cnt[o];
		}
		printf("%d %d\n", num, ans);
	}
	return 0;
}



【2017CCPC女生賽 B】【DP】Building Shops

Building Shops

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
HDU’s n classrooms are on a line ,which can be considered as a number line. Each classroom has a coordinate. Now Little Q wants to build several candy shops in these n classrooms.

The total cost consists of two parts. Building a candy shop at classroom i would have some cost ci. For every classroom P without any candy shop, then the distance between P and the rightmost classroom with a candy shop on P's left side would be included in the cost too. Obviously, if there is a classroom without any candy shop, there must be a candy shop on its left side.

Now Little Q wants to know how to build the candy shops with the minimal cost. Please write a program to help him.
 

Input
The input contains several test cases, no more than 10 test cases.
In each test case, the first line contains an integer n(1n3000), denoting the number of the classrooms.
In the following n lines, each line contains two integers xi,ci(109xi,ci109), denoting the coordinate of the i-th classroom and the cost of building a candy shop in it.
There are no two classrooms having same coordinate.
 

Output
For each test case, print a single line containing an integer, denoting the minimal cost.
 

Sample Input
3 1 2 2 3 3 4 4 1 7 3 1 5 10 6 1
 

Sample Output
5 11

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 3030, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int n;
pair<int, int> a[N];
LL f[N][N];
int main()
{
	while(~scanf("%d", &n))
	{
		for (int i = 1; i <= n; ++i)
		{
			scanf("%d%d", &a[i].first, &a[i].second);
		}sort(a + 1, a + n + 1);

		MS(f, 63); f[1][1] = a[1].second;
		for (int i = 2; i <= n + 1; ++i)
		{
			//自己不建
			LL mn = 1e18;
			for (int j = 1; j < i; ++j)
			{
				f[i][j] = f[i - 1][j] + a[i].first - a[j].first;
				gmin(mn, f[i - 1][j]);
			}

			if (i == n + 1)
			{
				printf("%lld\n", mn);
				break;
			}

			//自己建
			f[i][i] = mn + a[i].second;
		}
	}
	return 0;
}
/*
【題意】
有n個節點,我們可以選擇在每個節點建或不建商店。
對於第i個點,其座標是a[i].x,建設商店的成本爲a[i].c。
每個節點對答案的貢獻是——dis(i點的座標, i向左方向走最近節點的座標)。
讓你安排一個方案,使得"∑所有節點對答案的貢獻"儘可能小。

【分析】
顯然要按照座標排序。
用f[i][j]表示我們考慮到第i個點,i向左走,距離i最近的有商店的點是j對應的前綴最小成本。
那麼有轉移f[i][j] = f[i - 1][j] + dis(i, j);
特別的,如果我們在第i個點建服務器,那麼有f[i][i] = max(f[i - 1][j], for all j);
這樣在f[n][1~n]中找到答案就好啦

【時間複雜度&&優化】
f(n^2)

*/


【2017CCPC女生賽 C】【暴力】Coprime Sequence

Coprime Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
Do you know what is called ``Coprime Sequence''? That is a sequence consists of n positive integers, and the GCD (Greatest Common Divisor) of them is equal to 1.
``Coprime Sequence'' is easy to find because of its restriction. But we can try to maximize the GCD of these integers by removing exactly one integer. Now given a sequence, please maximize the GCD of its elements.
 

Input
The first line of the input contains an integer T(1T10), denoting the number of test cases.
In each test case, there is an integer n(3n100000) in the first line, denoting the number of integers in the sequence.
Then the following line consists of n integers a1,a2,...,an(1ai109), denoting the elements in the sequence.
 

Output
For each test case, print a single line containing a single integer, denoting the maximum GCD.
 

Sample Input
3 3 1 1 1 5 2 2 2 3 2 4 1 2 4 8
 

Sample Output
1 2 2


#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 1e5 + 10, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int n;
int a[N], bef[N], beh[N];
int gcd(int x, int y)
{
	return y == 0 ? x : gcd(y, x % y);
}
int main()
{
	scanf("%d", &casenum);
	for (casei = 1; casei <= casenum; ++casei)
	{
		scanf("%d", &n);
		for (int i = 1; i <= n; ++i)scanf("%d", &a[i]);
		bef[1] = a[1]; for (int i = 2; i <= n; ++i)bef[i] = gcd(bef[i - 1], a[i]);
		beh[n] = a[n]; for (int i = n - 1; i >= 1; --i)beh[i] = gcd(beh[i + 1], a[i]);
		int ans = max(bef[n -  1], beh[2]);
		for (int i = 2; i < n; ++i)gmax(ans, gcd(bef[i - 1], beh[i + 1]));
		printf("%d\n", ans);
	}
	return 0;
}
/*
【題意】
n個數,恰好去掉一個後的最大gcd

【分析】
很常見的套路,暴力枚舉去掉的數是哪個,然後前綴後綴max一下就好啦!

*/


【2017CCPC女生賽 D】【最短路+計數】Deleting Edges

Deleting Edges

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
Little Q is crazy about graph theory, and now he creates a game about graphs and trees.
There is a bi-directional graph with n nodes, labeled from 0 to n1. Every edge has its length, which is a positive integer ranged from 1 to 9.
Now, Little Q wants to delete some edges (or delete nothing) in the graph to get a new graph, which satisfies the following requirements:
(1) The new graph is a tree with n1 edges.
(2) For every vertice v(0<v<n), the distance between 0 and v on the tree is equal to the length of shortest path from 0 to v in the original graph.
Little Q wonders the number of ways to delete edges to get such a satisfied graph. If there exists an edge between two nodes i and j, while in another graph there isn't such edge, then we regard the two graphs different.
Since the answer may be very large, please print the answer modulo 109+7.
 

Input
The input contains several test cases, no more than 10 test cases.
In each test case, the first line contains an integer n(1n50), denoting the number of nodes in the graph.
In the following n lines, every line contains a string with n characters. These strings describes the adjacency matrix of the graph. Suppose the j-th number of the i-th line is c(0c9), if c is a positive integer, there is an edge between i and j with length of c, if c=0, then there isn't any edge between i and j.
The input data ensure that the i-th number of the i-th line is always 0, and the j-th number of the i-th line is always equal to the i-th number of the j-th line.
 

Output
For each test case, print a single line containing a single integer, denoting the answer modulo 109+7.
 

Sample Input
2 01 10 4 0123 1012 2101 3210
 

Sample Output
1 6

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 55, M = N * N, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int n;
char s[N][N];
struct node
{
	int x;		//x表示當前點的編號
	int dis;	//dis表示從起點到當前點的距離,注意有時需要LL
	bool operator < (const node&b)const
	{
		return dis > b.dis;
	}
};
struct Dijkstra
{
	int first[N], id;
	struct Edge
	{
		int w, c, nxt;
	}edge[M];
	int f[N];	//f[x]表示從ST到x的最短路
	bool e[N];	//e[x]表示我們是否更新過從ST到x的最短路
	priority_queue<node>q;
	void init()
	{
		for (int i = 1; i <= n; ++i)first[i] = 0;
		id = 1;
	}
	void ins(int x, int y, int z)
	{
		edge[++id] = { y,z,first[x] };
		first[x] = id;
	}
	void inq(int y, int dis)
	{
		if (dis >= f[y])return;
		f[y] = dis;
		q.push({ y,dis });
	}
	void dijkstra()
	{
		LL ans = 1;
		for (int i = 1; i <= n; ++i)
		{
			f[i] = inf;
			e[i] = 0;
		}
		int finish = 0;
		while (!q.empty())q.pop(); inq(1, 0);
		while (!q.empty())
		{
			int x = q.top().x; q.pop();
			if (e[x])continue; e[x] = 1; ++finish;
			if (x != 1)
			{
				int cnt = 0;
				for (int y = 1; y <= n; ++y)if (y != x && e[y] && s[y][x] != '0' && f[y] + s[y][x] - 48 == f[x])++cnt;
				ans = ans * cnt % Z;
			}
			for (int z = first[x]; z; z = edge[z].nxt)
			{
				inq(edge[z].w, f[x] + edge[z].c);
			}
		}
		if (finish != n)ans = 0;
		printf("%lld\n", ans);
	}
}dij;
int main()
{
	while (~scanf("%d", &n))
	{
		dij.init();
		for (int i = 1; i <= n; ++i)
		{
			scanf("%s", s[i] + 1);
			for (int j = 1; j <= n; ++j)if (s[i][j] != '0')
			{
				dij.ins(i, j, s[i][j] - 48);
			}
		}
		dij.dijkstra();
	}
	return 0;
}
/*
【題意】
讓你把一個圖刪成一棵樹,使得1到每個點的最短路保持不變

【分析】
我們可以直接求出1到每個點的最短路,然後看看每個點的前驅邊可能是有幾條(顯然對於每一條合法前驅邊,以任何一條作爲前綴都是等價的)
所有點可能的前驅邊數量,乘起來就是最後的答案啦!

【時間複雜度&&優化】
O(nlogn)

*/


【2017CCPC女生賽 E】【分塊打表 原題】Easy Summation

Easy Summation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
You are encountered with a traditional problem concerning the sums of powers.
Given two integers n and k. Let f(i)=ik, please evaluate the sum f(1)+f(2)+...+f(n). The problem is simple as it looks, apart from the value of n in this question is quite large.
Can you figure the answer out? Since the answer may be too large, please output the answer modulo 109+7.
 

Input
The first line of the input contains an integer T(1T20), denoting the number of test cases.
Each of the following T lines contains two integers n(1n10000) and k(0k5).
 

Output
For each test case, print a single line containing an integer modulo 109+7.
 

Sample Input
3 2 5 4 2 4 1
 

Sample Output
33 30 10
 
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 0, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;

int ans[4][1005] =
{
	{0,163183,319464,468941,611712,747875,877528,1000769,1117696,1228407,1333000,1431573,1524224,1611051,1692152,1767625,1837568,1902079,1961256,2015197,2064000,2107763,2146584,2180561,2209792,2234375,2254408,2269989,2281216,2288187,2291000,2289753,2284544,2275471,2262632,2246125,2226048,2202499,2175576,2145377,2112000,2075543,2036104,1993781,1948672,1900875,1850488,1797609,1742336,1684767,1625000,1563133,1499264,1433491,1365912,1296625,1225728,1153319,1079496,1004357,928000,850523,772024,692601,612352,531375,449768,367629,285056,202147,119000,35713,999952391,999869118,999785999,999703132,999620615,999538546,999457023,999376144,999296007,999216710,999138351,999061028,998984839,998909882,998836255,998764056,998693383,998624334,998557007,998491500,998427911,998366338,998306879,998249632,998194695,998142166,998092143,998044724,998000007,997958090,997919071,997883048,997850119,997820382,997793935,997770876,997751303,997735314,997723007,997714480,997709831,997709158,997712559,997720132,997731975,997748186,997768863,997794104,997824007,997858670,997898191,997942668,997992199,998046882,998106815,998172096,998242823,998319094,998401007,998488660,998582151,998681578,998787039,998898632,999016455,999140606,999271183,999408284,999552007,999702450,999859711,23881,195072,373375,558888,751709,951936,1159667,1375000,1598033,1828864,2067591,2314312,2569125,2832128,3103419,3383096,3671257,3968000,4273423,4587624,4910701,5242752,5583875,5934168,6293729,6662656,7041047,7429000,7826613,8233984,8651211,9078392,9515625,9963008,10420639,10888616,11367037,11856000,12355603,12865944,13387121,13919232,14462375,15016648,15582149,16158976,16747227,17347000,17958393,18581504,19216431,19863272,20522125,21193088,21876259,22571736,23279617,24000000,24732983,25478664,26237141,27008512,27792875,28590328,29400969,30224896,31062207,31913000,32777373,33655424,34547251,35452952,36372625,37306368,38254279,39216456,40192997,41184000,42189563,43209784,44244761,45294592,46359375,47439208,48534189,49644416,50769987,51911000,53067553,54239744,55427671,56631432,57851125,59086848,60338699,61606776,62891177,64192000,65509343,66843304,68193981,69561472,70945875,72347288,73765809,75201536,76654567,78125000,79612933,81118464,82641691,84182712,85741625,87318528,88913519,90526696,92158157,93808000,95476323,97163224,98868801,100593152,102336375,104098568,105879829,107680256,109499947,111339000,113197513,115075584,116973311,118890792,120828125,122785408,124762739,126760216,128777937,130816000,132874503,134953544,137053221,139173632,141314875,143477048,145660249,147864576,150090127,152337000,154605293,156895104,159206531,161539672,163894625,166271488,168670359,171091336,173534517,176000000,178487883,180998264,183531241,186086912,188665375,191266728,193891069,196538496,199209107,201903000,204620273,207361024,210125351,212913352,215725125,218560768,221420379,224304056,227211897,230144000,233100463,236081384,239086861,242116992,245171875,248251608,251356289,254486016,257640887,260821000,264026453,267257344,270513771,273795832,277103625,280437248,283796799,287182376,290594077,294032000,297496243,300986904,304504081,308047872,311618375,315215688,318839909,322491136,326169467,329875000,333607833,337368064,341155791,344971112,348814125,352684928,356583619,360510296,364465057,368448000,372459223,376498824,380566901,384663552,388788875,392942968,397125929,401337856,405578847,409849000,414148413,418477184,422835411,427223192,431640625,436087808,440564839,445071816,449608837,454176000,458773403,463401144,468059321,472748032,477467375,482217448,486998349,491810176,496653027,501527000,506432193,511368704,516336631,521336072,526367125,531429888,536524459,541650936,546809417,552000000,557222783,562477864,567765341,573085312,578437875,583823128,589241169,594692096,600176007,605693000,611243173,616826624,622443451,628093752,633777625,639495168,645246479,651031656,656850797,662704000,668591363,674512984,680468961,686459392,692484375,698544008,704638389,710767616,716931787,723131000,729365353,735634944,741939871,748280232,754656125,761067648,767514899,773997976,780516977,787072000,793663143,800290504,806954181,813654272,820390875,827164088,833974009,840820736,847704367,854625000,861582733,868577664,875609891,882679512,889786625,896931328,904113719,911333896,918591957,925888000,933222123,940594424,948005001,955453952,962941375,970467368,978032029,985635456,993277747,958993,8679306,16438777,24237504,32075585,39953118,47870201,55826932,63823409,71859730,79935993,88052296,96208737,104405414,112642425,120919868,129237841,137596442,145995769,154435920,162916993,171439086,180002297,188606724,197252465,205939618,214668281,223438552,232250529,241104310,249999993,258937676,267917457,276939434,286003705,295110368,304259521,313451262,322685689,331962900,341282993,350646066,360052217,369501544,378994145,388530118,398109561,407732572,417399249,427109690,436863993,446662256,456504577,466391054,476321785,486296868,496316401,506380482,516489209,526642680,536840993,547084246,557372537,567705964,578084625,588508618,598978041,609492992,620053569,630659870,641311993,652010036,662754097,673544274,684380665,695263368,706192481,717168102,728190329,739259260,750374993,761537626,772747257,784003984,795307905,806659118,818057721,829503812,840997489,852538850,864127993,875765016,887450017,899183094,910964345,922793868,934671761,946598122,958573049,970596640,982668993,994790206,6960370,19179597,31447978,43765611,56132594,68549025,81015002,93530623,106095986,118711189,131376330,144091507,156856818,169672361,182538234,195454535,208421362,221438813,234506986,247625979,260795890,274016817,287288858,300612111,313986674,327412645,340890122,354419203,367999986,381632569,395317050,409053527,422842098,436682861,450575914,464521355,478519282,492569793,506672986,520828959,535037810,549299637,563614538,577982611,592403954,606878665,621406842,635988583,650623986,665313149,680056170,694853147,709704178,724609361,739568794,754582575,769650802,784773573,799950986,815183139,830470130,845812057,861209018,876661111,892168434,907731085,923349162,939022763,954751986,970536929,986377690,2274360,18227051,34235854,50300867,66422188,82599915,98834146,115124979,131472512,147876843,164338070,180856291,197431604,214064107,230753898,247501075,264305736,281167979,298087902,315065603,332101180,349194731,366346354,383556147,400824208,418150635,435535526,452978979,470481092,488041963,505661690,523340371,541078104,558874987,576731118,594646595,612621516,630655979,648750082,666903923,685117600,703391211,721724854,740118627,758572628,777086955,795661706,814296979,832992872,851749483,870566910,889445251,908384604,927385067,946446738,965569715,984754096,3999972,23307455,42676636,62107613,81600484,101155347,120772300,140451441,160192868,179996679,199862972,219791845,239783396,259837723,279954924,300135097,320378340,340684751,361054428,381487469,401983972,422544035,443167756,463855233,484606564,505421847,526301180,547244661,568252388,589324459,610460972,631662025,652927716,674258143,695653404,717113597,738638820,760229171,781884748,803605649,825391972,847243815,869161276,891144453,913193444,935308347,957489260,979736281,2049501,24429032,46874965,69387398,91966429,114612156,137324677,160104090,182950493,205863984,228844661,251892622,275007965,298190788,321441189,344759266,368145117,391598840,415120533,438710294,462368221,486094412,509888965,533751978,557683549,581683776,605752757,629890590,654097373,678373204,702718181,727132402,751615965,776168968,800791509,825483686,850245597,875077340,899979013,924950714,949992541,975104592,286958,25539751,50863062,76256989,101721630,127257083,152863446,178540817,204289294,230108975,255999958,281962341,307996222,334101699,360278870,386527833,412848686,439241527,465706454,492243565,518852958,545534731,572288982,599115809,626015310,652987583,680032726,707150837,734342014,761606355,788943958,816354921,843839342,871397319,899028950,926734333,954513566,982366747,10293967,38295338,66370951,94520904,122745295,151044222,179417783,207866076,236389199,264987250,293660327,322408528,351231951,380130694,409104855,438154532,467279823,496480826,525757639,555110360,584539087,614043918,643624951,673282284,703016015,732826242,762713063,792676576,822716879,852834070,883028247,913299508,943647951,974073674,4576768,35157345,65815496,96551319,127364912,158256373,189225800,220273291,251398944,282602857,313885128,345245855,376685136,408203069,439799752,471475283,503229760,535063281,566975944,598967847,631039088,663189765,695419976,727729819,760119392,792588793,825138120,857767471,890476944,923266637,956136648,989087075,22118009,55229562,88421825,121694896,155048873,188483854,221999937,255597220,289275801,323035778,356877249,390800312,424805065,458891606,493060033,527310444,561642937,596057610,630554561,665133888,699795689,734540062,769367105,804276916,839269593,874345234,909503937,944745800,980070921,15479391,50971322,86546805,122205938,157948819,193775546,229686217,265680930,301759783,337922874,374170301,410502162,446918555,483419578,520005329,556675906,593431407,630271930,667197573,704208434,741304611,778486202,815753305,853106018,890544439,928068666,965678797,3374923,41157156,79025587,116980314,155021435,193149048,231363251,269664142,308051819,346526380,385087923,423736546,462472347,501295424,540205875,579203798,618289291,657462452,696723379,736072170,775508923,815033736,854646707,894347934,934137515,974015548,13982124,54037355,94181332,134414153,174735916,215146719,255646660,296235837,336914348,377682291,418539764,459486865,500523692,541650343,582866916,624173509,665570220,707057147,748634388,790302041,832060204,873908975,915848452,957878733,999999916},

	{0,512248278,195993196,492234908,135973547,156209260,875942187,912172454,175900194,872125554,499848646,852069610,15788558,372005630,595720938,655934601,815646738,631857461,955566889,931775127,999482287,891688474,635393793,551598349,255302240,655505571,955208433,651410917,535113121,691315136,499017046,631218942,54920901,31123014,114825358,155028010,294731047,970934546,914638570,150843189,998548487,70754506,274461330,810669015,174377610,154587185,834297796,590509485,94222308,310436321,498151566,210368085,294085927,890305134,434025734,654247776,573971288,510196305,73922855,170150973,997880687,50112004,113844966,270079587,893815888,654053876,513793572,730034990,853778137,730023020,497769646,590018022,733768148,950020024,553773643,154029005,653786110,250044937,433805486,990067743,997831687,830097304,153864573,930133487,413904004,154176110,993949784,70224977,814001682,950279850,498059446,770340442,374122789,210406452,474191389,654477551,534264889,190553354,994342904,610633469,998425007,410717448,394510743,790804829,734599636,654895101,274691154,610987732,974784758,971082155,498879846,751177761,214975809,671273920,195071996,155369960,215167721,331465188,755262270,31558862,999354887,791650226,835444788,851738468,855531161,155822755,355613152,351902233,335689886,791975999,499760446,532043115,255823880,332102622,715879215,656153526,695925429,672194791,715961479,252225353,999986287,972244127,475998733,112249965,775997683,656241726,235981947,292218199,895950328,412178166,499901566,112120360,495834394,192043493,35747496,155946235,975639542,211827228,875509139,271685079,999354887,951518367,315175337,571325622,494969026,155105360,914734442,430856062,654470038,830576167,498174246,490264079,933845463,249918181,153482037,653536821,53082309,949118305,232644571,88660904,996167087,728162882,351648072,227622433,11085734,651037751,390478239,766406974,609823711,45728212,493120246,664999561,568365912,504219054,67558735,147384710,926696727,882494520,785777837,701546419,988800007,300538328,583761130,79468133,322659078,142333685,661491688,297132800,760256755,55863259,482952046,634522822,397575300,953109200,776124221,635620076,594596471,10053105,532989691,108405914,975301487,666676088,9529416,124861170,427671035,626958696,725723838,20966139,103685291,858880972,465552846,396700598,419323899,594422420,276995825,116043785,54565964,329562026,472031628,306974427,953390087,824278251,626638576,361470712,323774309,102549010,580794465,935510310,637696181,452351721,438476566,949070352,631132701,425663249,567661625,586127451,304060349,838459948,600325856,294657695,920455087,770717633,432444948,786636647,8292324,566411601,223994065,38039324,359546979,833516624,398947846,288840246,30193411,444006935,645280398,43013380,340205475,533856256,914965303,68532182,873556487,503037770,423975611,397369576,478219231,15524135,652283861,325497954,266165980,999287498,343862046,412889190,613368475,646299446,506681648,483514626,159797918,412531069,412713610,625345079,809425007,17952918,597928357,190350834,730219887,446535026,862295782,794501665,354152192,946246887,269785246,317766793,377191031,29057463,148365599,904114942,759304981,470935219,90005152,961514283,724462087,311848060,950671698,161932469,760629876,855763387,850332484,441336642,619775343,670648055,172954246,999693398,317864958,588468408,566503202,300968801,134864666,705190258,942945024,73128411,614739887,380778885,478244859,308137249,565455502,239199051,612367343,261959804,58975874,168414986,49276566,454560047,431264848,320390395,756936114,669901417,282285723,111088451,967309020,955946828,476001287,220471809,176357799,624658662,140373789,592502592,144044455,251998783,667364967,435142391,894330453,677928530,712936013,220352279,715176719,6408696,197047601,684092804,158543668,605399577,303659887,826323975,40391190,106860909,480732488,911005283,440678643,406751931,440224496,466095687,703364853,665031336,158094478,283553628,436408121,305657292,874300483,419337015,511766230,16587449,92800007,193403225,65396424,749778932,581550056,189709117,497255436,721188320,372507076,256211018,471299453,410771681,761627009,504864730,915484151,562484558,308865251,311625523,21764660,184281955,838176694,316448149,246095613,548118365,437515677,423286828,308431090,189947735,458836035,800095255,192724653,909723508,518091064,878826593,146929339,771398574,495233535,355433480,682997660,102925312,534215694,189868036,576881589,496255583,42989255,606081849,868532588,807340702,693505421,92025968,861901580,156131459,421714842,399650938,124938963,926578140,427567664,544906758,489594624,766630471,175013494,807742909,51817897,588237674,392001421,732108340,171557612,567348439,70479995,125951475,472762060,143910924,466397255,61220220,843379007,21872769,99700694,873861949,435355687,169181082,754337301,163823490,664638823,817782446,478253512,795051181,211174592,463622905,583395259,895490800,18908660,866647999,645707935,857087614,295786161,50802715,505136408,335786358,513751697,304031543,265625021,251531249,408749345,178278420,295117592,788265972,980722664,489486772,225557407,393933673,493614667,317599486,952887234,780476994,475367863,6558931,637049295,923838031,717924222,164306951,701985308,63958355,277225182,662784858,835636452,704779033,473211670,637933432,989943381,614240572,889824074,489692935,380846217,824282975,375002250,882003104,488284571,630845706,40685543,742803137,56197508,593867711,262812766,264031714,92523582,537287404,681322200,901626997,869200815,549042674,200151594,375526595,922166690,981070885,987238193,669667620,51358172,449308862,474518682,31986631,320711715,833692926,357929249,974419690,58163220,278158845,597405543,272902292,855648084,190641883,416882681,967369449,569101151,243076765,304295262,361755606,318456761,371397691,11577353,23994711,487648722,775538336,554662503,786020180,724610310,919431843,213483715,743764883,941274276,531010830,531973488,257161179,313572839,602207397,318063775,950140909,281437707,388953105,643686018,710635361,548800049,411178997,844771120,690575319,83590502,452815584,521249459,305891028,117739192,561792852,537050895,236512215,147175706,50040255,20104749,426368075,931829113,493486736,362339831,83387271,495627936,732060692,219684405,679497955,126500194,869690002,512066224,950627733,376373374,274302013,423412502,896703693,61174424,577823561,401649935,781652398,260829781,676180936,158704687,133399879,319265343,729299910,670502404,743871656,844406490,161105723,176968186,668992696,708178063,659523104,182026629,228687455,46504385,176476229,453601790,6879864,259309261,927888777,23617194,851493329,10515950,393683867,187995855,874450710,228047200,317784121,506660248,451674356,103825220,708111622,803532323,223086091,93771701,836587921,166533498,92607207,917807809,239134044,947584687,228158471,559854164,715670506,762606244,61660118,267830882,330117269,491518019,289031865,553657547,410393791,278239330,870192897,193253204,548418991,530688970,29061860,226536387,600111263,920785200,253556903,957425098,685388476,384445749,295595622,953836800,188167967,121587835,171095095,47688438,756366562,596128144,159971875,334896446,301900534,535982823,806141990,175376705,685652,933067508,917520929,193044585,292637153,43297289,566023663,275814924,881669742,386586759,87564638,575602035,735697592,746849958,82057775,508319699,86634358,172000401,413416463,753881179,430393177,973951099,209553559,256199199,526886640,728614503,862381409,223185972,400026820,275902560,27811806,126753172,337725265,719726692,625756053,702811955,891892998,427997775,840124893,951272938,878440503,32626174,118828551,136046213,377277746,429521729,173776741,785041368,732314175,778593741,980878638,690167431,551458692,503750986,780042878,907332926,706619688,292901722,75177586,756445838,333705015,97953675,634190369,821413634,832622014,134814046,488988281,950143249,867277480,883389511,935477872,254541086,365577690,87586200,533565146,110513037,519428403,755309753,107155596,157964455,784734839,158465243,744154190,300800168,881401693,832957253,796465350,706924479,793333135,578689806,879992987,808241159,768432810,459566421,874640480,300653454,318603831,803490085,924310683,144064092,219748793,202363246,436905918,562375269,511769759,512087848,84327989,43488642,498568260,852565289,802478175,339305364,748045309,607696442,791257209,465726042,92101380,425381662,514565313,702650765,626636443,217520772,700302184,593979090,711549915,160013070,340366980,947610056,970740702,692757329,690658348,835442163,292107171,519651783,271074389,593373393,827547185,608594155,865512700,821301203,992958054,191481629,521870325,383122511,468236570,764210878,552043804,406733724,197279007,86678022,531929138,284030710,387981107,182778684,301421803,670908819,512238080,340407941,964416757,487262862,305944611,111460345,888808412,916987139,768994867,311829930,706490669,407975404,165282469,21410191,313356897,672120907,22700534,584094112,869299947,685316352,133141640,607774131,798212124,687453925,552497840,964342175,787985222,182425280,600660655,789689632,790510503,938121560,861521088,483707372,21678697,986433355,182969603,710285740,961380030,623250744,676896160,397314542,353504161,408463281,719190166,736683073,205940259,165959988,949740517,184280082,790576954,983629369,272435570,459993814,643302337,213359375,855163178,547711968,564003988,471037467,129810634,695321725,616568955,636550553,792264741,414709734,128883754,853785023,802411742,481762126,692834390,530626735,384137369,936364500,164306315,338961029,25326829,82401916,663184484,214672713,477864804,487758937,573353299,357646070,757635437,984319573,542696651,231764851,144522346,667967309,483097899,564912289,182408638,898585119,570439877,348971078,679176881,300055431,244604887,839823401,706709111,760260169,209474713,557350895,600886846,431080704,432930607,285434686,961591079,728397903,146853289,71955368,652702264,332092087,847122968,228793010,802100344,186043066,293619300,331827149,801664723,498130118,510221444,220936797,307274280,740231989,784808013,441},

	{0,24398083,389738264,967730634,201621270,97960270,218369711,671311670,103856210,693449415,139681334,656054044,961749594,273398033,296845424,218921809,699209237,861809743,287113362,3566136,479438100,614591275,732247689,570757363,275366318,389984575,848954148,968817044,440083270,318998840,19313754,304050019,277269628,375842581,361214871,311176491,611629434,948355686,298785226,923764054,359322135,408441462,132824007,844659756,98394667,682498733,611233912,116422176,639213504,821853854,499453191,691753487,594896700,573192795,150887730,3931470,951745980,948993204,77343100,537241640,639678768,797956442,519456613,397409239,102660271,375439667,17129371,882031348,869135535,913887890,979958364,51008901,122461466,193266003,257668463,296978797,271338956,111490891,710544560,915745907,520244883,254863446,779863554,676715151,439864195,468500644,58326449,393323575,537521973,426767601,860490424,493472393,827615480,203709636,793200840,589959043,402046217,843484334,326023352,50909250,652000,930793581,361675951,570209103,581639009,161315648,806461013,737937076,892013830,912137261,140697355,610796119,38015532,812185608,989152333,282545707,55547744,312660451,691473835,454433903,480610676,257466168,872622407,5629400,919733196,453643802,13303260,563653612,620404886,241803124,20398375,74812688,41508112,66554703,797398524,374629624,423750080,46941955,814835333,758276277,360094871,546873206,680713366,551005442,366195532,745553741,710942167,678582922,450826118,207917874,499768316,237719563,686313755,455061018,490207499,66503338,778970696,534671713,544476557,314831389,639526384,591463710,514425549,14842083,953559515,437608020,811969815,651347096,751930080,123164977,979522025,732263434,981211449,506516301,260424242,359045524,74122399,824797140,169379999,797117270,519959219,264328140,62886327,46304081,435027710,531047522,709665839,411264983,133075290,420943103,861098765,71924619,695723043,390484387,821655036,653905361,542897754,127054607,19326326,798959324,3264000,119382795,576058136,735400457,884656206,227975831,878181808,848536592,44510659,255550506,146846616,251101493,960297648,517465585,8451836,353686940,299953429,412153856,65078774,435174757,492312372,991554207,464922843,213168889,297538954,531543654,472725612,414427465,377559857,102369439,40206876,345294840,866496010,139081065,376496719,462133672,941094645,11962352,518567549,941756971,391161367,596963514,901666182,251860148,189992217,846133194,929745884,721453113,64805714,358050541,545898441,111292275,67174925,948257280,802786222,184312661,143459521,219689726,433074214,276059930,705237840,133110903,419862113,865122457,199738929,577542558,567116359,143563368,680274642,940697231,70102199,587352645,376671647,679410318,85815764,526799126,265703531,890072141,303416104,716982610,641522835,879059983,514657258,908185892,686093110,733170165,184320310,416326826,39620987,890050102,20645459,693390402,370988247,708630352,545764068,897860774,948183849,39556686,666130713,465153337,208736000,795622158,242955260,678046797,330144246,522199119,662634928,237115199,800311486,967671336,407186317,831160025,987976049,653865999,624677506,707642208,713143757,446485819,699660081,243114230,817519988,125541063,823601212,513652171,734941718,955781631,565315702,865287751,61809591,257129077,441398057,484440400,127519989,975108735,486654535,968349335,564897067,251281698,824535209,895505581,880624823,993676958,237566016,396084062,25679154,447223385,737780848,722375657,965759947,764181860,137153559,819219235,251723065,574577275,618030084,894433739,590012494,556630631,303560439,989250235,413092329,7191073,828130833,548743968,449878879,412167974,907795682,992266439,296172702,16962956,910709700,283877426,985090682,396901995,427559941,502777096,557498057,27667435,841997876,413738012,632440524,855730093,901071421,37537224,977576260,868781266,285657021,221388325,79607985,666164836,180891713,209373493,714715060,29309305,846605168,212875568,518985480,492159872,187751740,981010108,558847993,911610461,324842571,371057424,901504128,37935798,164377598,918894692,185360251,85223495,969277651,409427946,190459656,301806064,929316474,447024197,408914586,540693001,731552823,25943447,615338310,830002842,130762501,100770780,437277179,943395219,519870435,156848397,925642696,970502923,500382704,780707693,125143544,887363960,452818630,230501292,644717698,126853607,107142820,6435145,227964418,149116489,113197236,421200558,323576368,11998607,611133244,170406248,655771637,941479429,801843670,903010434,794725809,902103911,517394870,791752851,727004026,167414595,791458793,103586848,425993044,890383665,429745016,770111444,422333296,673844961,580432835,958003349,374350941,140926091,304603293,639449062,638489934,505480473,146671264,162576920,839744075,142519370,704817502,821889161,442089072,158643988,201420683,428693952,318914611,962477511,53489503,881537501,323456398,835097150,443094706,736636064,859228229,500466234,887801147,778308043,450454032,695866252,811099855,589406021,312499958,742328902,112840096,121748832,922306416,115068161,739661443,266553624,588820122,13912355,255425790,424867901,23426190,933736201,411649471,78001593,910380181,234892849,717935274,357959126,477240124,713646001,12404511,617871457,65298635,172601897,32129102,2428144,700014945,991141441,983563603,18309423,661446942,695852194,112977255,104618236,54683262,530960493,276886103,203312308,380275345,28763472,512484989,329636203,104669463,580061146,608079643,142553380,230638818,4588432,673518739,515178263,867715577,121447261,710625951,105208276,802622928,319538592,183632009,925355941,69707157,127994489,589606776,913780885,521369711,786610191,28891269,504521945,398499219,816276140,775529771,197929210,900903597,589410072,847701831,131096077,757742069,900389066,578154369,648291314,797957258,535981586,184633718,871391109,520707221,845779572,340317687,270311140,665797526,312630461,744247610,233438645,784113294,123069285,691760409,638064457,808051269,737750706,644920664,420815067,621951874,461881065,802952662,148084701,632531274,15650473,672672453,586467369,339313425,104664853,638919920,273188907,905062151,990377996,534990828,86539068,726213172,60523603,213068887,816303564,3306195,399547404,114657815,734196108,311416970,359039144,841013394,164290505,170589318,128164688,723575512,53452701,616267229,304098070,394400254,541772832,769726890,462453542,356591944,532997280,408508762,727717644,554735201,264960750,536849643,343681253,945327002,880018326,956114710,243871660,67208731,995477506,835229582,621984612,611998277,274030286,281112390,502316368,994522034,994185230,909105840,310195776,923246999,620699477,413409234,442416322,970712828,375010860,137510582,837668186,143963878,805669934,644618630,546970298,454981298,358772025,288094909,304102415,491115043,948389328,781885833,96037163,985515972,527002914,770954713,733372107,387567876,655934842,401713848,420761786,433319576,75780173,892456581,327349811,715916944,276839068,103789327,157200893,256034973,69548809,109063685,719732920,72309854,154915890,764808452,500148992,751771018,694948059,281161686,229869512,20273178,883086374,792302804,456964228,312928441,514637273,926884589,116584282,344538308,557204637,378465281,101394294,680025772,721121832,475940640,832004404,304867353,29883772,753975981,827402321,195525182,390579003,523438244,275385407,889879043,164321717,441828064,602992733,57658415,736683857,83711813,46937107,70874584,88127131,511153677,224037179,574252650,364435124,844147691,701649462,55663597,447145305,831049816,568100402,416556384,523981118,419009995,3118448,542389959,659284031,324404216,848266115,873065350,364445592,603266561,177371998,973357707,168339499,221721262,866962905,103348365,187753649,626414785,166695836,788856928,697822201,314947851,269790116,391873269,702457625,406307534,883459402,680989656,504782779,211299289,799343753,401832759,277562958,802979036,463941707,847495748,633637957,587085188,549042330,428970314,196354113,872470749,522157265,245578767,169996396,441535335,216952802,655406071,910220444,120657265,403681941,845731900,494484612,350625603,359616434,403462708,292482070,757072214,439478862,885563799,536572831,720903827,645874684,389491348,892215814,948734105,199724293,123624506,28400900,43315680,110695093,977697435,188081023,73972251,747633541,93231343,758604184,147030598,408997196,433966610,842145528,976252673,893286817,356294774,826139414,453267628,69478370,179690636,953711464,218003920,447455147,757144309,894110619,229121332,748439766,45593253,313141202,334443043,475426262,676354387,443594988,841387691,483612150,525556082,655683239,87401415,550830467,284570273,27468774,10389953,947981842,30444494,915298053,719150663,9466538,796333948,524233177,63804579,703616557,141933535,478484014,206228516,203127626,723909971,391840213,190487077,455491330,866333781,438103281,513264744,753427119,131111397,921518639,694297920,305314385,888417228,847207671,846806999,805624539,887125667,491599801,247928415,5353025,825243203,972864549,909146726,282451439,920340456,821343566,146726621,212259529,479984233,549982725,152145046,137937293,472169605,224764163,562523211,740897028,95751942,35138344,31058660,611235372,350878997,864456122,797457362,818165395,609422941,860400776,258365711,480448627,185412433,5420101,537802652,336827142,905464697,687158471,57591681,316455600,679217536,268888846,107792950,109333310,69761437,659944898,417135295,736736300,864071620,886153018,723448306,121649345,643440059,660264400,344094383,659198079,353907594,952387104,746400813,787080995,876695966,560418091,118091791,556001543,598639859,680475314,937720532,200100179,982618998,477329746,545101264,707386428,137990163,654837464,711741354,390170919,391019301,26371684,211273315,455497483,855313533,85254852,389886904,575575181,2253231,575190672,736761150,458210374,231424109,60696169,454496424,417238786,441049230,497533780,29546509,942957560,598421097,803143368,802650656,272557300,310333702,427074306,539265612,960554176,393514596,921417547,999997732},

	{0,186912818,987873282,112372461,719365719,397412938,145107001,351790304,778559416,539557859,83557022,175825174,880284597,541956839,769696129,419210835,576373119,540816649,809822480,62493013,144214130,51405372,916558314,993562990,643322508,319655736,555488122,949330627,152046785,853907918,771936373,637536998,184416654,136791889,197884704,38706460,287129905,517249300,239028686,888238278,816678930,282694790,441974033,338637700,896616706,911316912,41572366,801886657,554962319,504518474,688396497,971953843,41745980,399496484,356355163,27444399,326693561,961961531,430447364,14389096,777050623,558996700,974656130,409172975,15545978,712056042,179981829,861603556,958494792,430102480,992615037,118118532,34041089,722885298,922248802,125133011,580539936,294357080,30530547,312526201,425078959,416230225,99653423,57267664,642139519,981672912,981087154,327183076,492397303,739144606,124448416,504859465,541662484,706371098,286510785,391689997,959959359,764459009,420354079,392058261,745500,432149835,744653311,877662060,660270474,820213512,993107106,731976708,517073957,765981452,844005645,74857868,751623494,148019141,529938122,167283882,346091667,380938229,627639707,496237593,464272846,90348098,27978008,39727708,11639390,967947013,86079088,711949688,375537424,806752695,951592939,988586081,345522059,716472505,79098483,712246445,213832188,519013057,918648156,78046742,56004753,324129386,786451858,799328259,191628539,285213615,915700570,453515993,825237474,535223135,687529372,8116640,867343435,302748291,42120030,526856020,935608595,208219602,69943082,55956015,536157241,740254466,783139416,690551090,425027140,912143378,67041368,821244222,149760383,98475682,811833389,560802433,771133777,51904836,224352099,350991787,765028701,100053141,320026001,749551907,104440531,522556039,594954582,397309991,521627550,108245882,878126997,165434383,950399336,892475263,363780238,482827608,148544712,74579769,823896844,843658934,500399216,115480373,842054,495036454,999552007,15425206,180140578,304818688,411692354,771870940,943392769,809565670,617595638,17503607,101330364,442629548,136248797,838399029,807011780,942384746,828115375,772322621,849156797,940597555,778539986,987168847,125620880,730935314,361292382,639540084,297008958,217615055,482250978,413465062,620428688,44191682,3225883,239256775,963383281,902485649,345921493,192509926,997803813,21650130,276038527,573237878,574221056,837377793,867515646,165149104,276076822,841246933,646910515,675063192,154174806,610207265,917920448,352466286,641270956,16205139,266042489,789206131,646803335,615948310,243373083,899326540,831761531,220810165,233547183,79041437,63695531,646873554,496816926,546848406,51864164,645114029,395269787,863781690,162522987,11722673,798186274,633804780,414351740,878568421,667537094,384342482,654021286,183799831,823619881,626952490,911900071,322586494,890835388,98136465,937900090,977999824,423603220,180290669,917462373,132033424,212417080,502796049,367681970,256763000,770039507,723247876,213572470,685645690,997836127,488824883,44469998,164958976,32249438,577797923,550576760,585379116,271412115,221178112,139644059,893699019,581899758,604504527,733794887,184685696,685623230,549771361,746485939,973077224,726860473,377494647,239609224,645719139,19427830,948918460,260733147,93840461,973990915,888360618,360483090,525469148,205514905,985697945,290061534,457987063,820854492,778990991,878907687,890824510,886483180,317248300,92496590,658294213,76362221,103330177,270277813,962564871,499949022,216991961,543753559,86774156,710345016,618066818,434696358,288281308,892583123,629788040,633506253,872059145,232054668,602250871,957707478,444225649,463075854,756013825,490584663,345715072,597593685,205839517,899958573,266088499,834031465,164575035,937101297,37483966,646273768,327171776,115791013,608706084,52790942,434844830,571506252,199455141,65903119,19371863,100759612,634695787,321183717,327531527,380571090,859165141,887002483,425681341,368080822,632020481,254208021,484475134,880301413,401626419,505949882,243719966,354009717,360481582,667640083,657372583,785778200,680284813,237054209,718675350,852145725,927140878,894572014,465431739,209927927,656905693,393557479,165421302,976667080,190671064,630878481,681954164,391221414,570388933,897565870,19565001,654494064,694635116,309612122,49846601,950301406,634512596,418909505,417422847,646380983,129694294,4327702,626061269,675538930,264605374,42931017,304925095,96936877,324745026,861335038,654964822,837518421,833147804,467202820,75449258,613575027,766984435,60880630,970636154,32451540,954302183,727173142,736582237,874391147,650904677,307258145,928092882,554519824,297371294,450740834,605811185,764970394,456216027,847847523,863446626,297145986,929185866,641758920,535143182,44123091,54698692,21082915,82987009,183194075,185420726,992466874,664653602,538549226,345983400,333349390,381194447,124098307,70839818,724851673,704963256,866431650,422260709,64808299,87681624,507920686,188469858,960937612,748644290,689958093,261919106,404151499,643063806,216337352,197702807,622004825,610554824,496771900,952111840,112284241,703757819,170553719,801327085,856736617,697102353,910351515,440252475,714936883,775709852,406148319,261487505,998295488,404435882,529318706,814439275,224205274,377051959,676845422,444574025,50327947,45566837,295675587,112808232,389019984,729687351,587216404,395039164,701898095,306418710,391970339,661814961,474544191,979804394,254309870,438144243,871349872,230805445,667391707,943445231,570500386,947319404,498210525,811634339,779098164,734338614,592792245,991354342,428425798,404248169,561526779,826341994,549348595,647263292,744640323,315935201,827856588,882006240,357807135,555719693,340746088,286222736,817900861,358315181,471440763,7637921,248885311,54301076,5952174,554951784,167844832,473281686,408979894,368974112,351154110,105090912,280151063,573898995,880787534,441136513,990399533,908718781,370768045,495883807,498484442,838777579,373755540,508478948,347648392,847464275,967774726,824511681,842415056,908045040,523082515,957917610,405526326,135635358,649174967,833019993,115019009,619311595,321933669,206711036,421440980,434362004,190911697,270772714,45206862,834677341,66759042,434337070,54093254,625280903,588787577,286486062,120873416,714998149,72675502,738990916,961091509,849265778,538311365,349190957,950976306,523080348,917777505,823012016,925494472,74086408,443473078,698124266,156543294,955804136,216376582,207239648,511282980,190996448,954447867,321548768,790608401,5175725,921169658,974297300,247760409,640249934,34228633,464501909,287076654,348308311,154335986,40805722,342881872,565546592,554187468,665473256,938517735,266331680,567562990,958524866,925512172,497405895,418565725,322010741,902888245,92230674,231000709,244424399,816612496,565469847,217892962,785255660,739182828,187612349,51145115,239683153,829355892,239734529,411334564,983406378,472013980,448401895,717650109,497617176,598171452,600710414,37968127,574110838,185120634,339467311,179068272,700536615,936717285,138511388,956988632,625787804,143805493,458172842,647520434,105531326,724782203,80872589,616842290,827876831,446301111,626861143,132293886,519185260,324116204,250096931,353289247,230017011,204064722,514264212,502369459,801219541,523189675,448930418,216394946,510154488,251001845,785843078,77877246,897064362,10881336,375366199,326450286,771578665,381618602,783056216,750481177,399359594,379094988,66377378,758820522,868887222,118102812,731556745,632692244,638384171,654304939,870578579,957722913,262879854,6333840,478318353,236110572,301414181,358030241,949816224,678933132,404380785,440821180,757689991,178596182,581009775,96237661,309687629,461420424,646989988,18571786,986379294,420368516,852230761,677673393,358988813,627911505,688763202,421886200,587364778,29034717,878780995,761123511,998091041,814383216,542820683,830083358,842736792,473546685,548081506,31603212,236246136,28483932,36884703,860154207,275467176,447086825,135272376,905474800,337820588,236883747,841745818,36344049,560107744,218882613,96143368,764494355,497458320,481553344,28657828,788663661,962417438,514949875,388993302,718787269,44172279,524971683,155661604,980329093,307918286,927764814,325418186,898752439,174364768,24262409,882837537,964130319,479380122,854864806,950028116,275895243,213776491,234259029,116486805,167728566,443233991,966377951,949092882,12589292,408364395,239498802,682241430,207882440,804914379,201481344,88116378,340766888,244108232,715145433,527102971,533602751,893130142,293788150,178339746,969538258,295745897,216840466,450410091,598236135,373064218,825663364,572173233,21739529,604437493,999483495,363734795,560477417,388502087,811468368,187556845,499409507,584358158,364941025,79707451,514310715,232888951,809734243,61249756,278195092,458219654,538684214,629770566,247879299,549315711,564263801,431048430,630685574,221720690,75355237,110861275,531284212,59433650,174162393,346933512,278675579,136926007,793262510,61022655,933311618,821297927,792797465,811145495,974356847,754574211,237804564,363943710,167088919,16139728,855686834,447189086,610438674,465314340,673822786,682428153,964669655,264067298,837315775,697766390,859197207,579871235,606882789,420791929,480547054,468695588,536882807,551638772,340453389,938139596,833484635,216189500,224096470,190704748,892974262,799417537,318479743,47206821,20201736,958868864,520946464,550327347,327167567,818283309,927835841,748304635,811748580,341355308,503278675,658764313,616563344,885634200,928132549,412689362,467977100,936563993,629056460,578529670,295246174,21662699,987725048,666451085,29801924,804841168,730182254,812724002,584674200,360861358,496334561,644251442,14054282,629934251,589583699,323236658,852997408,52457149,906598877,771990247,637264696,383890588,47228521,77876747,603304705,689774674,604551567,78400817,568374411,520884995,635068169,126432839,990799745,268528025,309030025,35574096,210375609,699976034,740910160,205661442,868905468,674041497,12201}
};
void table()
{
	fre();
	for (int k = 2; k <= 5; ++k)
	{
		int sum = 0;
		for (int i = 1; i <= 1e9; ++i)
		{
			LL val = i; for (int j = 2; j <= k; ++j)val = val * i % Z;
			gadd(sum, val);
			if (i % 1000000 == 0)
			{
				printf("%d,", sum);
			}
		}
		puts("");
	}
}
int n, K;
int main()
{
	//table(); return 0;
	scanf("%d", &casenum);
	for (casei = 1; casei <= casenum; ++casei)
	{
		scanf("%d%d", &n, &K);
		if (K == 0)printf("%d\n", n);
		else if (K == 1)
		{
			int ans = (1ll + n) * n / 2 % Z;
			printf("%d\n", ans);
		}
		else
		{
			int o = n / 1000000;
			int sum = ans[K - 2][o];
			for (int i = o * 1000000 + 1; i <= n; ++i)
			{
				LL val = i; for (int j = 2; j <= K; ++j)val = val * i % Z;
				gadd(sum, val);
			}
			printf("%d\n", sum);
		}
	}
	return 0;
}
/*
【題意】
直接暴力求1^k + ... + n ^ k

【分析】
數據規模被縮小了。
本來是1e9的數據規模,可能要推式子(其實最省腦是分塊打表)
後來改成了1e4的數據模擬,直接暴力就好啦。

*/


【2017CCPC女生賽 F】【Bitset 不會做 有空補】Forgiveness 需要補★

Forgiveness

Time Limit: 14000/7000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
Little Q is now checking whether string A matches B. Two strings are considered matched if they have the same length, and there are no position i that Ai is different from Bi.
However, Little Q is a kind man, he forgives every person hurt him. What's more, he even forgives strings! He gives the string 3 opportunities, if there are no more than 3 positions i that Ai is different from Bi, then Little Q will also consider the two strings matched.
For a string SS[l,r] means the substring combined by Sl,Sl+1,...,Sr. And the function occ(A,B) returns the number of substrings in string B which matches A.
Little Q now has a long numeric 1-based string S, and his job is to deal with m operations:

1. + l r k, for every positions from l to r, change Si to (Si+k)mod10.
2. ? l r T, report occ(T,S[l,r]).

After lots of work, Little Q is very tired now, please write a program to help him deal with these operations.
 

Input
The first line of the input contains an integer T(1T15), denoting the number of test cases.
In each test case, there are two integers n(1n50000) and m(1m50000) in the first line, denoting the length of string S and the number of operations.
The second line of the input contains a numeric string S with n integers, each number Si is in the range of 0 to 9.
In the following m lines, each line describes an operation.
If it is a modification, then it is in the format of ''+ l r k'', where 1lrn and 1k9.
If it is a query, then it is in the format of ''? l r T'', where 1lrn and T is a numeric string composed of integers from 0 to 9.
It is guaranteed that |T|100000 in each test case, and there are no more than 4 test cases satisfying min(n,m)>1000.
 

Output
For each query, print a single line with an integer, denoting the answer.
 

Sample Input
1 5 5 01234 ? 2 5 1234 ? 2 5 1777 ? 2 5 9999 + 1 5 5 ? 1 5 56789
 

Sample Output
1 1 0 1


【2017CCPC女生賽 G】【判定】Graph Theory 要不不連前綴邊 要不連所有前綴邊 判判斷是否可以n個數配成二分之n對

Graph Theory

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
Little Q loves playing with different kinds of graphs very much. One day he thought about an interesting category of graphs called ``Cool Graph'', which are generated in the following way:
Let the set of vertices be {1, 2, 3, ..., n}. You have to consider every vertice from left to right (i.e. from vertice 2 to n). At vertice i, you must make one of the following two decisions:
(1) Add edges between this vertex and all the previous vertices (i.e. from vertex 1 to i1).
(2) Not add any edge between this vertex and any of the previous vertices.
In the mathematical discipline of graph theory, a matching in a graph is a set of edges without common vertices. A perfect matching is a matching that each vertice is covered by an edge in the set.
Now Little Q is interested in checking whether a ''Cool Graph'' has perfect matching. Please write a program to help him.
 

Input
The first line of the input contains an integer T(1T50), denoting the number of test cases.
In each test case, there is an integer n(2n100000) in the first line, denoting the number of vertices of the graph.
The following line contains n1 integers a2,a3,...,an(1ai2), denoting the decision on each vertice.
 

Output
For each test case, output a string in the first line. If the graph has perfect matching, output ''Yes'', otherwise output ''No''.
 

Sample Input
3 2 1 2 2 4 1 1 2
 

Sample Output
Yes No No

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 2e5 + 10, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
LL fac[N];	//階乘預處理
LL inv[N];	//階乘逆元預處理
LL f[N];	//用f[i]記錄從(1,1)走到這個點i的方案數
void factorial()
{
	int top = 2e5;
	fac[0] = 1; for (int i = 1; i <= top; i++)fac[i] = fac[i - 1] * i%Z;
	inv[0] = inv[1] = 1; for (int i = 2; i <= top; i++)inv[i] = inv[Z%i] * (Z - Z / i) % Z;
	for (int i = 2; i <= top; i++)inv[i] = inv[i] * inv[i - 1] % Z;
}
LL C(int n, int m)
{
	return fac[n] * inv[m] % Z*inv[n - m] % Z;
}
void table()
{
	int f[105][105]; MS(f, 0);
	int ans[105];
	int top = 20; f[0][0] = 1;
	for (int i = 1; i <= top; ++i)
	{
		ans[i] = 0;
		for (int j = 0; j <= i / 2; ++j)
		{
			f[i][j] = f[i - 1][j];						//這裏放的是1
			if (j)f[i][j] += f[i - 1][j - 1];			//這裏放的是0
			ans[i] += f[i][j];
		}
		printf("%d ", ans[i]);
	}puts("");
}
int main()
{
	//table();
	factorial();
	scanf("%d", &casenum);
	for (casei = 1; casei <= casenum; ++casei)
	{
		int n; scanf("%d", &n);
		if (n & 1)puts("0");
		else
		{
			int ans = C(n, n / 2);
			printf("%d\n", (Z + 1) / 2ll * ans % Z);
		}
	}
	return 0;
}
/*
【題意】
有n個點,每個點要不不連前綴邊 要不連所有前綴邊,判斷是否可以n個數配成n/2對。

【分析】
顯然我們從後向前看,任意時刻2的數量一定要比1的數量多。
於是直接一個for就做完啦!

這道題的原題是判定在2^n個圖中(每個點可能爲1或2),有多少個可以配對成n/2的圖
對於原題,答案是C(n, n / 2),這個可以通過打表發現,或者自己思考爲什麼2333

*/

【2017CCPC女生賽 H】【矩陣快速冪】Happy Necklace 珍珠染色素數都滿足

Happy Necklace

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of multiple red and blue beads.
Little Q desperately wants to impress his girlfriend, he knows that she will like the necklace only if for every prime length continuous subsequence in the necklace, the number of red beads is not less than the number of blue beads.
Now Little Q wants to buy a necklace with exactly n beads. He wants to know the number of different necklaces that can make his girlfriend happy. Please write a program to help Little Q. Since the answer may be very large, please print the answer modulo 109+7.
Note: The necklace is a single string, {not a circle}.
 

Input
The first line of the input contains an integer T(1T10000), denoting the number of test cases.
For each test case, there is a single line containing an integer n(2n1018), denoting the number of beads on the necklace.
 

Output
For each test case, print a single line containing a single integer, denoting the answer modulo 109+7.
 

Sample Input
2 2 3
 

Sample Output
3 4

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 0, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int prime[10] = { 2,3,5,7,11,13,17 };
int s[24];
int ans[24];
int n;
void table()
{
	for (n = 1; n <= 20; ++n)
	{
		int top = 1 << n;
		for (int sta = 0; sta < top; ++sta)
		{
			for (int i = 0; i < n; ++i)s[i] = (sta >> i & 1) ? 1 : -1;
			bool flag = 1;
			for (int l = 0; l < n; ++l)
			{
				for (int i = 0; i < 7 && l + prime[i] <= n; ++i)
				{
					int sum = 0;
					for (int j = l + prime[i] - 1; j >= l; --j)sum += s[j];
					if (sum < 0) { flag = 0; break; }
				}
				if (!flag)break;
			}
			ans[n] += flag;
		}
		printf("%d\n", ans[n]);

	}
}

const int G = 3;
struct MX
{
	int v[G][G];
	void O() { MS(v, 0); }
	void E() { MS(v, 0); for (int i = 0; i < G; ++i)v[i][i] = 1; }
	void P()
	{
		for (int i = 0; i < G; ++i)
		{
			for (int j = 0; j < G; ++j)printf("%d ", v[i][j]); puts("");
		}
	}
	MX operator * (const MX &b) const
	{
		MX c; c.O();
		for (int k = 0; k < G; ++k)
		{
			for (int i = 0; i < G; ++i) if (v[i][k])
			{
				for (int j = 0; j < G; ++j)
				{
					c.v[i][j] = (c.v[i][j] + (LL)v[i][k] * b.v[k][j]) % Z;
				}
			}
		}
		return c;
	}
	MX operator + (const MX &b) const
	{
		MX c; c.O();
		for (int i = 0; i < G; ++i)
		{
			for (int j = 0; j < G; ++j)
			{
				c.v[i][j] = (v[i][j] + b.v[i][j]) % Z;
			}
		}
		return c;
	}
	MX operator ^ (LL p) const
	{
		MX y; y.E();
		MX x; memcpy(x.v, v, sizeof(v));
		while (p)
		{
			if (p & 1)y = y * x;
			x = x * x;
			p >>= 1;
		}
		return y;
	}
}a, b;

int main()
{
	//table(); 
	//f[i] = f[i - 1] + f[i - 3];

	a.v[0][0] = 2; a.v[0][1] = 3; a.v[0][2] = 4;

	b.v[0][0] = 0; b.v[0][1] = 0; b.v[0][2] = 1;
	b.v[1][0] = 1; b.v[1][1] = 0; b.v[1][2] = 0;
	b.v[2][0] = 0; b.v[2][1] = 1; b.v[2][2] = 1;

	scanf("%d", &casenum);
	for (casei = 1; casei <= casenum; ++casei)
	{
		LL n; scanf("%lld", &n); --n;
		MX c = a * (b ^ n);
		printf("%lld\n", c.v[0][0]);
	}
	return 0;
}
/*
【題意】
有一串珍珠,長度爲n(1e18)
每個珍珠要不染色成紅色,要不染色成藍色。
要求任何連續素數長度的珍珠,都必須是紅色個數>=藍色個數
讓你求出有多少種對這串珍珠的染色方案。

【分析】
我們用f[i]表示長度爲i的珍珠串的合法染色方案數。
顯然,如果第i顆珍珠染色爲紅色,f[i-1]的都依然合法、
如果第i顆珍珠染色爲藍色,要求這連續三顆必須爲紅紅藍,於是收穫f[i-3]的貢獻。
而只要2、3素數滿足要求,所有素數都會滿足要求(因爲它們可以拆成2與3)。
所以得到遞推式:f[i] = f[i - 1] + f[i - 3]
矩陣快速冪即可求解。

【時間複雜度&&優化】
O(logn * 27)

*/


【2017CCPC女生賽 I】【LCA 時間戳】Innumerable Ancestors

Innumerable Ancestors

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
There is a tree having n nodes, labeled from 1 to n. The root of the tree is always 1, and the depth of a node p is the number of nodes on the shortest path between node p and the root.
In computer science, the Lowest Common Ancestor (LCA) of two nodes v and w in a tree is the lowest (i.e. deepest) node that has both v and w as descendants, where we define each node to be a descendant of itself (so if v has a direct connection from ww is the lowest common ancestor).
You have to answer m queries. Each query gives two non-empty node sets A and B, there might be some nodes in both sets.
You should select one node x from set A, and one node y from set Bx and y can be the same node. Your goal is to maximize the depth of the LCA of x and y.
Please write a program to answer these queries.
 

Input
The input contains several test cases, no more than 5 test cases.
In each test case, the first line contains two integers n(1n100000) and m(1m100000), denoting the number of nodes and queries.
For the next n1 lines,each line contians two integers a and b, denoting a bi-directional edge between node a and b.
Then there are 2m lines, every two lines describes one query.
For each query, the first line describes the set A.
The first integer k(1kn) denotes the number of nodes in set A, and the next k integers describing the nodes in set A. There might be some nodes appear multiple times in the set.
The second line describes the set B in the same format of set A.

It is guaranteed that k100000 in each test case.
 

Output
For every query, print a number denoting the answer, which means the maximum depth of the LCA.
 

Sample Input
7 3 1 2 1 3 3 4 3 5 4 6 4 7 1 6 1 7 2 6 7 1 7 2 5 4 2 3 2
 

Sample Output
3 4 2

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 1e5 + 10, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int n, m;
int ga, gb;
int a[N], b[N];

vector<int>w[N];				//記錄邊
int dep[N];						//記錄深度
int f[N][20];					//f[i][j]表示與i的距離爲2^j的祖先

int dfn[N], tim;
void dfs(int x)
{
	dfn[x] = ++tim;
	for (auto y : w[x])
	{
		if (y == f[x][0])continue;
		f[y][0] = x;
		dep[y] = dep[x] + 1;
		dfs(y);
	}
}

void LCAinit()
{
	for (int j = 1; (1 << j) < n; ++j)
	{
		for (int i = 1; i <= n; ++i) if (f[i][j - 1])
		{
			f[i][j] = f[f[i][j - 1]][j - 1];
		}
	}
}
int LCA(int x, int y)
{
	//步驟一,使得x與y在相同深度
	if (dep[x] < dep[y])swap(x, y);
	int i; for (i = 0; (1 << i) <= dep[x]; ++i); --i;
	for (int j = i; dep[x] > dep[y]; --j)if (dep[x] - (1 << j) >= dep[y])x = f[x][j];
	if (x == y)return x;

	//步驟二,在倍增祖先不同的情況下向上跳,最後使得f[x][0] = f[y][0]
	for (int j = i; f[x][0] != f[y][0]; --j)if (f[x][j] != f[y][j])
	{
		x = f[x][j];
		y = f[y][j];
	}
	return f[x][0];
}

bool cmp(int x, int y)
{
	return dfn[x] < dfn[y];
}

int main()
{
	while(~scanf("%d%d", &n, &m))
	{
		for (int i = 1; i <= n; ++i)w[i].clear();
		for (int i = 1; i < n; ++i)
		{
			int x, y; scanf("%d%d", &x, &y);
			w[x].push_back(y);
			w[y].push_back(x);
		}
		MS(f, 0);
		tim = 0; dep[1] = 1; dfs(1);
		LCAinit();

		for (int i = 1; i <= m; ++i)
		{
			scanf("%d", &ga); for (int i = 1; i <= ga; ++i)scanf("%d", &a[i]);
			scanf("%d", &gb); for (int i = 1; i <= gb; ++i)scanf("%d", &b[i]);
			sort(a + 1, a + ga + 1, cmp);
			sort(b + 1, b + gb + 1, cmp);

			int ans = 0;
			int j = 1;
			for (int i = 1; i <= ga; ++i)
			{
				while (j < gb && dfn[b[j]] < dfn[a[i]])++j;
				if (j > 1)
				{
					gmax(ans, dep[LCA(a[i], b[j - 1])]);
				}
				gmax(ans, dep[LCA(a[i], b[j])]);
			}
			printf("%d\n", ans);
		}
	}
	return 0;
}
/*
【題意】
一棵樹,有n(1e5)個節點。
同時存在m(1e5)個詢問。每個詢問給你2個集合。
要你求出
for(第一個集合中的點x)
{
	for(第一個集合中的點y)
	{
		max(dep[ lca(x,y) ]);
	}
}

【分析】
這道題要大膽猜!
顯然,如果我們考慮了x,哪個點y,會可能產生儘可能大的dep[ lca(x,y) ]呢?
一定是與x時間戳(dfs序)最接近的節點y。

因爲要知道一棵子樹的dfs序必然是連續的一段。

所以如果y是x或者是x的子孫,都一樣會收穫對於x最好的y,產生的dep[ lca(x,y) ]就等於dep[x]
而如果y不是x的子孫,則還是基於dfs序定理,最接近的一定可以獲取到最大的dep[ lca(x,y) ](可以畫一棵樹標上dfs序腦補一下!)

然而雙log,在樹上二分也是可以過的哦~

【時間複雜度&&優化】
O(nlogn)

*/


【2017CCPC女生賽 J】【DP博弈】Judicious Strategy

Judicious Strategy

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
Alice and Bob is now playing a game about strings.
There is a dictionary containing n words (words might be same). Alice choose a lowercase English letter arbitrarily first, but this letter should appear in at least one of these n words. Then Bob choose a lowercase English letter arbitrarily to add it before or after the letter Alice chose. So Bob gets a new string now. This new string should also be a substring (consecutive subsequence) of at least one strings in the dictionary. After that, it's Alice's turn. Alice should do the same thing, choosing a letter and add it before or after the current string, making a new string. At every moment, the string they made should always be a substring of at least one strings in the dictionary. The player who can't operate first lose the game and the other one win.
Besides, each player has a score. The score is calculated by the following rule:
If the string S is now made, the current player will get score(S) points. It means that Alice will score in the first round, then Bob, then Alice...
score(S)=i=1|S|value(Si)×maxi=1|S|value(Si)+occ(S)

where

1. |S| means the length of S.
2. value(c) represents the value of letter c. The score of letter ``a'' is 1, ``b'' is 2, ..., ``z'' is 26.
3. occ(S) means the time that S occurs as a substring in the dictionary, each word is counted just once.

Alice and Bob will play with best strategy. That is to say, they will consider to win first and then maximize their score, after that they will consider to minimize the score of others.
Please determine who will win the game, and report the final scores they will earn during the whole game.
 

Input
The input contains several test cases, no more than 10 test cases.
In each test case, the first line contains an integer n(1n30), denoting the number of words in the dictionary.
In the next n lines, each line contains a non-empty string wordi, denoting a word in the dictionary. The string is composed of lowercase English letters and its length will not exceed 30.
 

Output
For each test case, output a string in the first line. If Alice will win ,output ''Alice'', otherwise output ''Bob''.
Then print two integers A and B in second line, denoting the final score of Alice and Bob.
 

Sample Input
2 aba abac 3 artem nik max
 

Sample Output
Bob 29 35 Alice 2403 1882
 

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 0, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int n;
char s[32];
struct A
{
	int win;
	int me;
	int enemy;
	bool operator > (const A & b)
	{
		if (win != b.win)return win > b.win;
		if (me != b.me)return me > b.me;
		return enemy < b.enemy;
	}

	A Ene(int sco)
	{
		return{ 1 - win, enemy + sco, me };
	}
};
map<string, A>mop;
map<string, int>occ;
map<string, int>dfn;
int score(string s)
{
	int ret = 0;
	int mx = 0;
	for (int i = 0, sz = s.size(); i < sz; ++i)
	{
		ret += (s[i] - 'a' + 1);
		gmax(mx, s[i] - 'a' + 1);
	}
	return ret * mx + occ[s];
}

bool cmp(string a, string b)
{
	return a.size() < b.size();
}
int main()
{
	while (~scanf("%d", &n))
	{
		mop.clear(); occ.clear(); dfn.clear();
		for (int i = 1; i <= n; ++i)
		{
			scanf("%s", s);
			for (int l = 0; s[l]; ++l)
			{
				for (int r = l; s[r]; ++r)
				{
					char tmp = s[r + 1]; s[r + 1] = 0;
					if (dfn[s + l] != i)
					{
						dfn[s + l] = i;
						++occ[s + l];
					}
					s[r + 1] = tmp;
				}
			}
		}

		vector<string>vt;
		for (auto it : occ)vt.push_back(it.first);
		vt.push_back("");
		sort(vt.begin(), vt.end(), cmp);
		for (int i = vt.size() - 1; ~i; --i)
		{
			string s = vt[i];
			A now = { 0, 0, 0 };
			for (char ch = 'a'; ch <= 'z'; ++ch)
			{
				if (mop.count(s + ch))
				{
					gmax(now, mop[s + ch].Ene(score(s + ch)));
				}
				if (mop.count(ch + s))
				{
					gmax(now, mop[ch + s].Ene(score(ch + s)));
				}
			}
			mop[s] = now;
		}
		auto it = mop[""];
		printf("%s\n", it.win == 1 ? "Alice" : "Bob");
		printf("%d %d\n", it.me, it.enemy);
	}
	return 0;
}
/*
【題意】
給你n(30)個串,每個串的長度也不超過30。
Alice和Bob博弈,Alice先手,初始是空串。
每次要在串前或串後任意加一個小寫字符,使得原始串中,至少存在一個串包含該子串。不能操作就輸了。
雙方博弈的關鍵字是(勝敗,自己分數儘可能高,對手分數儘可能低)
讓你輸出Alice的最優結局。

【分析】
直接按照基本SG博弈的方法,從終止態退回初始態(空串)就好啦!
可以看看我是怎麼寫的,用到了很多小技巧。
先預處理好所有合法串,再按長度排序得到DP的順序。
接着直接做DP,這麼寫20分鐘就寫完1A啦!

【時間複雜度&&優化】
O(n^3 * log(n^3) )

*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章