中南4月16号网络同步赛

题目大意:

1.求方程x^a==b(mod N)解的数量,N是奇数

2.按照方程x^a==b(mod N)的解指示信鸽放飞时间将信鸽分组,每一组不少于k个信鸽,求总延迟最少的分组方法

 

大概做法:

1.N分解因子,分解为p1^e1*p2^e2... ...pi为素数,ei为正整数。

2.对于每一个pi^ei,求出xi^a=bi(mod pi^ei),式中bi=b%pi^ei()。可能有多解,需要算出xi的所有可能解。

3.判断解的总数,最终x^a==b(mod N)解的总数是所有xi^a=bi(mod pi^ei)解总数的乘积)。特判解总数为0的情况,解总数<k的情况,解总数>m的情况。这三种情况直接输出答案。解数特别多时第二步生成解可能超时,因此第二步就要判断解太大的情况。

4.枚举所有xi的取值组合,使用中国剩余定理还原出对应的xx是原方程x^a==b(mod N)的解。

5.对所有解排序,使用动态规划解出最小扣押延迟

 

 

难点:

xi^a=bi(mod pi^ei)的所有解:

bi==0

xi包含p^((ei+a-1)/a)的因子为充要条件,枚举之p^((ei+a-1)/a)的倍数

ei==1时:

pi的一个原根r,求r为底b的离散对数l,则r^l==bi(mod pi),则(r^(l/a))^a=r^l=b(mod pi),xi=r^(l/a),l/a实在mod phi(p)环境下的除法,可能多解或无解

ei!=1时:

bipi互素,做法与e==1相同

bipi不互素,有bi=pi^c *dc不整除a则无解,否则设x=pi^(c/a)*yy^a=d(mod pi^(ei-c)),求出所有y,即可求出x。注意要求出所有x,[0pi^ei-1]范围内的所有x,不要漏掉

 

因子分解:暴力,略。

中国剩余定理:见相关资料,原理略。主要是用中国剩余定理从分解因子后的各个xi^a=bi(mod pi^ei)方程的解还原出原始的x^a==b(mod N)的解,小心中间过程溢出

动态规划:

纯暴力不行。需要斜率优化,或者二分优化。实际上加上决策点的剪枝(i的决策只从>=i-1的决策点里面枚举)就能通过此题。

 

复杂度:

分解因子、离散对手:O(sqrt(n));

斜率优化的动态规划:O(ans),ans为方程解的个数,ans<=m

但动态规划前的排序复杂度为O(ans*log(ans)),是最慢的部分,可以考虑用针对整数的线性算法优化(标程没有优化)

 

Problem A: 十进制-十六进制

Time Limit: 1 Sec  Memory Limit:128 MB
SUBMIT: 241  Solved: 142
 
Description

 把十进制整数转换为十六进制,格式为0x开头,10~15由大写字母A~F表示。

Input

 每行一个整数x,0<= x <= 2^31。

Output

 每行输出对应的八位十六进制整数,包括前导0。

Sample Input

0
1023

Sample Output

0x00000000
0x000003FF

HINT

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int x;
	while(scanf("%d", &x) != EOF)
		printf("0x%08X\n", x);
	return 0;
}


 

Problem B: Sums

Time Limit: 1 Sec  Memory Limit: 16 MBSUBMIT: 294  Solved: 111
Description
Sometimes Ziwen need to operate even larger numbers. A limit of 1000 digits is so small… You have to find the sum of two numbers with maximal size of 1 000 000 digits.
 

Input

The first line contains a single integer N that is the length of the given integers(1 ≤ N ≤ 1 000 000). It is followed by these integers written in columns. That is, the next N lines contain two digits each, divided by a space. Each of the two given integers is not less than 0, and the length of their sum does not exceed N. The integers may contain leading zeroes.

Output

Output exactly N digits in a single line representing the sum of these two integers.

Sample Input

40 44 26 83 7

Sample Output

4750

HINT

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn = 1 << 20;
int a[maxn], b[maxn], n;
int main()
{
	int i, cur;
	while(scanf("%d", &n) != EOF)
	{
		for(i = n - 1; i >= 0; -- i)
			scanf("%d%d", &a[i], &b[i]);
		for(i = cur = 0; i < n; ++ i)
		{
			a[i] += b[i] + cur;
			cur = a[i] / 10;
			a[i] %= 10;
		}
		for(i = n - 1; i >= 0; -- i)
			printf("%d", a[i]);
		printf("\n");
	}
	return 0;
}

 

Problem C: Balls in the Boxes

 Time Limit: 1 Sec  Memory Limit: 128 MB
SUBMIT: 431  Solved: 80

Description
Mr. Mindless has many balls and many boxes,he wants to put all the balls into some of the boxes.Now, he wants to know how many different solutions he can have.
you know,he could put all the balls in one box,and there could be no balls in some of the boxes.Now,he tells you the number of balls and the numbers of boxes, can you to tell him the number of different solutions? Because the number is so large, you can just tell him the solutions mod by a given number C.
Both of boxes and balls are all different.
 

Input

There are multiple testcases. In each test case, there is one line cantains three integers:the number of boxes ,the number of balls,and the given number C separated by a single space.All the numbers in the input are bigger than 0 and less than 2^63.

Output

 For each testcase,output an integer,denotes the number you will tell Mr. Mindless

Sample Input

3 2 44 3 5

Sample Output

14

HINT 

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef long long LL;
LL box, ball, c;
LL MultiMod(LL a, LL b, LL c)
{
	LL res = 0;
	if(!b) return 0;
	while(b > 1)
	{
		if(b & 1) res = (res + a) % c;
		a = (a << 1) % c;
		b >>= 1;
	}
	return (res + a) % c;
}
LL PowMod(LL a, LL b, LL c)
{
	LL res = 1;
	while(b > 1)
	{
		if(b & 1) res = MultiMod(res, a, c);
		a = MultiMod(a, a, c);
		b >>= 1;
	}
	return MultiMod(res, a, c);
}
int main()
{
	while(scanf("%lld%lld%lld", &box, &ball, &c) != EOF)
		printf("%lld\n", PowMod(box, ball, c));
	return 0;
}

 

Problem D: 寒衣调

Time Limit: 1 Sec  Memory Limit:128 MB
SUBMIT: 457  Solved: 86

Description

男从戎,女守家。一夜,狼烟四起,男战死沙场。从此一道黄泉,两地离别。最后,女终于在等待中老去逝去。逝去的最后是换尽一生等到的相逢和团圆。
某日两人至奈何桥前,服下孟婆汤。
每滴孟婆汤都有强度不一的药效,设一碗孟婆汤共N滴(0<N<100000),其中第i滴(0≤i<N)用b[i]表示。
孟婆汤的药效与原料有关,设熬制前同样有N滴原料,第i滴原料用a[i]表示,0≤a[i]<2^32。
药效b[i]的计算方法为b[i]=(a[0]*a[1]*...*a[N-1]/a[i])%m(假设0/0=1),0<b[i]<2^32。

Input

每行开头给出原料数量N,取模数m,紧接着的一行按顺序给出原料a[i]。求出熬制所成孟婆汤的药效b[i],每次输完一碗孟婆汤的药效后以换行结尾。

Output

 求出熬制所成孟婆汤的药效b[i],每碗孟婆汤后以换行结尾。

Sample Input

5 11
2 7 5 3 9
3 7
9 8 5

Sample Output

10 6 4 3 1
5 3 2

HINT

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn = 1 << 17;
typedef long long LL;
int a[maxn], b[maxn], n, m;
void ReadData()
{
	int i;
	for(i = 0; i < n; ++ i)
		scanf("%d", &a[i]);
}
void Pre()
{
	int i;
	for(i = n - 1, b[n] = 1; i >= 0; -- i)
		b[i] = (LL)b[i + 1] * a[i] % m;
	for(i = 1; i < n; ++ i)
		a[i] = (LL)a[i - 1] * a[i] % m;
}
void Prin()
{
	int i;
	printf("%d", b[1] % m);
	for(i = 1; i < n; ++ i)
		printf(" %d", (LL)a[i - 1] * b[i + 1] % m);
	printf("\n");
}
int main()
{
	while(scanf("%d%d", &n, &m) != EOF)
	{
		ReadData();
		Pre();
		Prin();
	}
	return 0;
}

 

Problem E: Dominating

Time Limit: 1 Sec  Memory Limit: 128 MB
SUBMIT: 157  Solved: 45

Description

Dota是一款在大学中很盛行的游戏,10个人一起玩,分为两个团队:近卫和天灾,每个团队有5名玩家,游戏中以推塔为目的,但是更多的人却以杀人为乐趣,每杀一个人都有一定的经济作为奖励,当然如果被杀就会扣除一些经济作为惩罚了。为了简化规则,我们规定如下:
每个人的First为他杀第一个人的时候或者是他死后杀的第一个人的时候,Second表示他在杀第一个人和第二个人中间没有被敌方单位或队友杀过,Spree表示Second和杀第三个人之间没有被敌方单位或队友杀过,Dominating表示Spree和杀第4个人之间没有被敌方单位或队友杀过,Mega表示Dominating和杀第5个人之间没有被敌方单位或队友杀过,Unstop表示Mega和杀第6个人之间没有被敌方单位或队友杀过,Wicked表示Unstop和杀第7个人之间没有被敌方单位或队友杀过,Monster表示Wicked和杀第8个人之间没有被敌方单位或队友杀过,God表示Monster和杀第9个人之间没有被敌方单位或队友杀过,Holy表示God和杀第10人或者超过第10个人之间没有被敌方单位或队友杀过。
BFirst则表示该玩家第一次被敌方单位或队友杀死或者杀人之后第一次被敌方单位或队友杀死,BSecond表示BFirst和第二次被敌方单位或队友杀死之间没有杀过人,BSpree表示BSecond和第3次被敌方单位或队友杀死之间没有杀过人,依次类推
先给出杀人之后所得的金钱和死亡之后会扣除的金钱

First

200

BFirst

-200

Second

275

BSeconde

-275

Spree

325

BSpree

-325

Dominating

400

BDominating

-400

Mega

475

BMega

-475

Unstop

575

BUnstop

-575

Wicked

675

BWicked

-675

Monster

800

BMonser

-800

God

900

BGod

-900

Holy

1000

BHoly

-1000

现在给出一份各个玩家之间的杀与被杀的关系,请你求最后每位玩家剩下多少钱,这里不考虑系统发钱,每个玩家最开始的金钱为4726,如果某次死的时候,玩家身上没有足够的金钱,那么他的金钱会被扣到0,但是杀死他的玩家得到的金钱不变,自杀不会有金钱损失,同时也没有人会得到金钱,该玩家的杀敌状态也不变,被队友杀死的时候,死的玩家会掉钱,杀敌数变为0,杀人的玩家,杀敌数不变,同时没有玩家会得到金钱

Input

 多组测试数据,每组数据有多行,开始10行表示每个玩家的名字,前5个为近卫的玩家,后5个为天灾的玩家,接下来有一行,一个数字N(N<=100)表示接下来有多少行杀和被杀的数据,接下来有N行,每行有两个玩家的名字(用空格隔开),表示前面那个玩家杀死后面那个玩家。所有的玩家姓名为不超过15个字符的字符串

Output

 对于每组测试数据,按照输入的顺序输出每个玩家最后的金钱数目,每个玩家一行,表示他的金钱

Sample Input

PN
klion26
wdy0504
EX
Kelp
pkudream
wxt
Kaer
CC
STHM
7
PN  pkudream
EX  wxt
wdy0504	Kaer
CC Kelp
klion26 STHM
wxt	PN
wxt EX

Sample Output

4726
4926
4926
4726
4526
4526
5001
4526
4926
4526

HINT

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int K[11] = {0, 200, 275, 325, 400, 475, 575, 675, 800, 900, 1000};
int trie[200][128], tp, bh;
int situ[11], money[11];
char name[10][20], w[20], l[20];
int MakeT(char *x)
{
	int i, t, cur = 0;
	for(i = 0; x[i]; ++ i)
	{
		if(trie[cur][x[i]] == -1)
			trie[cur][x[i]] = ++ tp;
		cur = trie[cur][x[i]];
	}
	if(trie[cur][0] == -1) trie[cur][0] = bh ++;
	return trie[cur][0];
}
void win(char *x)
{
	int ith = MakeT(x);
	if(situ[ith] < 0)
		situ[ith] = 0;
	++ situ[ith];
	if(situ[ith] > 10) situ[ith] = 10;
	money[ith] += K[situ[ith]];
}
void lose(char *x)
{
	int ith = MakeT(x);
	if(situ[ith] > 0)
		situ[ith] = 0;
	-- situ[ith];
	if(situ[ith] < -10) situ[ith] = -10;
	money[ith] -= K[-situ[ith]];
	if(money[ith] < 0) money[ith] = 0;
}
int main()
{
	int i, j, k, n;
	while(scanf("%s", name[0]) != EOF)
	{
		tp = bh = 0;
		memset(trie, -1, sizeof(trie));
		situ[MakeT(name[0])] = 0, money[0] = 4726;
		for(i = 1; i < 10; ++ i)
		{
			scanf("%s", name[i]);
			situ[MakeT(name[i])] = 0;
			money[i] = 4726;
		}
		scanf("%d", &n);
		while(n --)
		{
			scanf("%s%s", w, l);
			if(MakeT(w) == MakeT(l)) continue;
			if(MakeT(w) / 5 != MakeT(l) / 5)
				win(w);
			lose(l);
		}
		for(i = 0; i < 10; ++ i)
			printf("%d\n", money[i]);
	}
	return 0;
}

 

Problem F: Nearest Numbers

 Time Limit: 1 Sec  Memory Limit:32 MB
SUBMIT: 248  Solved: 65

Description

 Given three integer sequences which have been sorted in ascending order,pick one integer from each sequence and we can get three integers.we want these three integers to be nearest to each other.Assuming these three integers as a,b,c, they are nearest to each other means d=(a-b)2+(b-c)2+(c-a)2 is the smallest.

Input

 There are many test cases. For each test case,the first line are three integers la,lb,lc, they let you know the length of each sequence. The following three lines separately have la,lb,lc integers,give you the integers in each sequence. 1<=la,lb,lc<=10^6 and All integers in the sequences are in the range of [-10^9,10^9].

Output

For each test case, just print one integer : the smallest d as mentioned above.

Sample Input

10 10 10
1 2 3 4 5 6 7 8 9 10
2 3 6 8 10 12 14 16 18 20
3 5 7 9 11 12 14 16 18 20

Sample Output

0

HINT

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn = 1 << 20;
typedef long long LL;
LL a[maxn], b[maxn], c[maxn];
inline LL min(LL x, LL y)
{return x < y ? x : y;}
inline LL cal(LL x, LL y, LL z)
{return (x - y) * (x - y) + (x - z) * (x - z) + (z - y) * (z - y);}
int main()
{
	LL ans, tmpa, tmpb, tmpc;
	int n1, n2, n3, i, j, k;
	while(scanf("%d%d%d", &n1, &n2, &n3) != EOF)
	{
		for(i = 0; i < n1; ++ i) scanf("%lld", &a[i]);
		for(i = 0; i < n2; ++ i) scanf("%lld", &b[i]);
		for(i = 0; i < n3; ++ i) scanf("%lld", &c[i]);
		ans = ((LL)1 << 63) - 1;
		i = j = k = 0;
		while(i < n1 && j < n2 && k < n3 && ans > 0)
		{
			ans = min(ans, cal(a[i], b[j], c[k]));
			tmpa = cal(a[i + 1], b[j], c[k]);
			tmpb = cal(a[i], b[j + 1], c[k]);
			tmpc = cal(a[i], b[j], c[k + 1]);
			if(tmpa < tmpb && tmpa < tmpc) ++ i;
			else if(tmpb < tmpc) ++ j;
			else ++ k;
		}
		printf("%lld\n", ans);
	}
	return 0;
}

 

Problem G: 二阶魔方

 Time Limit: 2 Sec  Memory Limit: 128 MB
SUBMIT: 21  Solved: 6

Description

 最近Grandeur买了两个魔方,拆开包裹的时候,室友都围了过来。“还有这种魔方,这多简单……”。因为有一个二阶魔方,别看它小,也不是好欺负的。Grandeur把魔方转动了几下递给他,说道“就不用完全复原了,你把上下相对的黄色和白色两个面弄出来试试咯。”于是他掰了一下午……

原来二阶魔方也不是那么简单的。Grandeur现在想知道对于一个特定的情况,最少需要几步可以达到黄白两面复原的状态呢(任意面任意方向旋转90度为一步)?

Input

 如图所示,按照二阶魔方的平面展开图给每一个方格编号。
第一行一个整数T,表示有T组数据。接下来T行每行24个空格隔开的数,表示0~23号格子的颜色,分别为0:黄色,1:白色,2:蓝色,3:绿色,4:红色,5:橙色。
输入数据保证是合法的状态,魔方没有拆开过。

Output

每组数据输出一个整数,表示达到目标状态需要的最少步数。

Sample Input

24 4 1 2 0 4 3 4 2 0 2 0 0 3 5 5 5 1 5 2 3 3 1 14 4 4 4 0 0 3 3 2 2 0 0 5 5 5 5 1 1 2 2 3 3 1 1

Sample Output

21

HINT

 编号只是方便描述数据,复原的魔方不一定要颜色和图中编号一一对应的。 

 

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
typedef long long LL;
const int HashMax = 1000003;
const int inf = 0x3f3f3f3f;
int ans[HashMax];
LL Hash[HashMax];
int ye, wh;
int RO[6][24]=	{
				{0,9,2,11,4,5,6,7,8,13,10,15,12,22,14,20,18,16,19,17,3,21,1,23},
				{0,22,2,20,4,5,6,7,8,1,10,3,12,9,14,11,17,19,16,18,15,21,13,23},
				{0,1,7,5,4,12,6,13,10,8,11,9,18,16,14,15,2,17,3,19,20,21,22,23},
				{0,1,16,18,4,3,6,2,9,11,8,10,5,7,14,15,13,17,12,19,20,21,22,23},
				{0,1,2,3,4,5,22,23,8,9,6,7,14,12,15,13,16,17,10,11,20,21,18,19},
				{0,1,2,3,4,5,10,11,8,9,18,19,13,15,12,14,16,17,22,23,20,21,6,7}
				};
int MakeHash(int y, int w)
{
	LL situ = (LL)y << 24 | w, big = situ % HashMax;
	while(Hash[big] != -1 && Hash[big] != situ)
		big = (big << 1 | 1) % HashMax;
	if(Hash[big] == -1) Hash[big] = situ;
	return big;
}

inline int min(int a, int b)
{return a < b ? a : b;}

struct S
{int y, w, pace;};
queue<S> q;
void bfs()
{
	S lin, nex;
	int i, j, situ;
	lin.pace = 0;
	lin.y = 0xf0000, lin.w = 0xf0, q.push(lin);
	ans[MakeHash(lin.y, lin.w)] = 0;
	lin.y = 0xf0, lin.w = 0xf0000, q.push(lin);
	ans[MakeHash(lin.y, lin.w)] = 0;
	lin.y = 0xf00000, lin.w = 0xf00, q.push(lin);
	ans[MakeHash(lin.y, lin.w)] = 0;
	lin.y = 0xf00, lin.w = 0xf00000, q.push(lin);
	ans[MakeHash(lin.y, lin.w)] = 0;
	lin.y = 0xf000, lin.w = 0xf, q.push(lin);
	ans[MakeHash(lin.y, lin.w)] = 0;
	lin.y = 0xf, lin.w = 0xf000, q.push(lin);
	ans[MakeHash(lin.y, lin.w)] = 0;
	while(!q.empty())
	{
		lin = q.front(), q.pop();
		for(i = 0; i < 6; ++ i)
		{
			nex.y = nex.w = 0;
			for(j = 0; j < 24; ++ j)
			{
				nex.y |= (lin.y >> RO[i][j] & 1) << j;
				nex.w |= (lin.w >> RO[i][j] & 1) << j;
			}
			nex.pace = lin.pace + 1;
			situ = MakeHash(nex.y, nex.w);
			if(ans[situ] == -1)
			{
				ans[situ] = nex.pace;
				q.push(nex);
			}
		}
	}
}
int main()
{
	int i, j, T;
	memset(Hash, -1, sizeof(Hash));
	memset(ans, -1, sizeof(ans));
	bfs();
	for(scanf("%d", &T); T --; )
	{
		for(i = ye = wh = 0; i < 24; ++ i)
		{
			scanf("%d", &j);
			if(j == 0) ye |= 1 << i;
			if(j == 1) wh |= 1 << i;
		}
		printf("%d\n", ans[MakeHash(ye, wh)]);
	}
	return 0;
}

 

Problem H: Plumber

 Time Limit: 1 Sec  Memory Limit: 64 MB
SUBMIT: 79  Solved: 29

Description

       Mr.Croft is a popular plumber(水管工) in this city,He is very good at analysis the structure of the pipe, so as to find out the problem. However, along with the progress of the water conservancy construction(水利建设) in this city, the structure of the water pipe is also more and more complex, which bring him a great challenge. 
       One day, he was sent to a community to fix the water pipes of some families. He first found the water pipe structure maps (as shown below)of the community,and Then he found this area have one water inlet and several water outlets, in totalN openings, he marked the water inlet as 0, and the water outlets from 1 to N-1; In the structure map,there areM connecting points of the water pipes, marked from N to N + M-1; In the map,the pipes can be seen as small sections divided by connecting points and the water inlets or the water outlets. There areL sections without valves(阀门) andK sections with valves.

              

       His mission is just need to shut down several valves, making somebody's water outlets no longer have the water out, so that he can repair the family's water pipes. There are a total of T families' water pipes need to repair, but he needs to repair them one by one. In order to improve the efficiency, he wants to know how many valves at least he needs to turn off to cut the target family's water supply.

Input

       There are many test cases. For each test case,the first line gives 5 integers :M,N,L,K,T as mentioned above.Then there are L lines,and each line gives 2 integers X,Y representing the two endpoints of the pipe sections.Then there are K lines,and each line gives 2 integers X,Y representing the two endpoints of the pipe sections with a valve(the first line represents valve with mark 1,the second represents valve with mark 2....and so on).At last there are T lines,with each line there is only one integer Z, representing the mark of the water outlet need to repair.
       (2<=N<=1000,2<=M+N<=2000,0<=K<=5000, 1<=T<=min(10,N),0<=X,Y<=M+N-1,1<=Z<=N-1)

Output

       For each test case,just print the least number of the valves that need to be shut down.If there's no solution to let the target outlet be without water,then just print "No solution!" instead.After each test case,print a blank line.

Sample Input

9 5 11 6 2
0 6
1 5
6 11
11 10
5 8
8 3
7 9
7 2
12 13
9 12
4 13
5 6
7 10
8 9
12 11
10 13
1 2
1 
2
17 7 19 11 2
0 9
9 13
13 23
1 7
2 10
3 14
4 15
14 15
15 16
16 22
6 21
8 21
17 18
18 19
7 19
12 22
11 12
20 22
23 10
7 8
10 11
14 17
16 18
5 20
21 23
8 9
12 13
11 17
20 19
21 13 
3
2

Sample Output

3
4

3
No solution!

HINT

 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
const int maxn = 1 << 11;
const int maxm = 1 << 14;
int p[maxn], fst[maxn], lay[maxn], work[maxn], M, N, L, K, T, wnum, sou, ter;
int flow[maxm], cap[maxm], u[maxm], v[maxm], nex[maxm];
void init()
{
	int i;
	for(i = M + N; i >= 0; -- i) p[i] = i;
	memset(fst, -1, sizeof(fst));
	wnum = 0;
}

int fa(int i)
{return p[i] == i ? i : p[i] = fa(p[i]);}

void AddEdge(int s, int e)
{
	u[wnum] = s;
	v[wnum] = e;
	cap[wnum] = 1;
	nex[wnum] = fst[s];
	fst[s] = wnum;
	++ wnum;
}
void DbEdge(int s, int e)
{
	AddEdge(s, e);
	AddEdge(e, s);
}
void ReadGraph()
{
	int s, e;
	while(L --)
	{
		scanf("%d%d", &s, &e);
		p[fa(s)] = fa(e);
	}
	while(K --)
	{
		scanf("%d%d", &s, &e);
		DbEdge(fa(s), fa(e));
	}
}


/********************网络流 ********************/
inline int min(int a, int b)
{return a < b ? a : b;}
queue<int> q;
const int inf = 0x3f3f3f3f;
int bfs()
{
	int i, j;
	while(!q.empty()) q.pop();
	memset(lay, -1, sizeof(lay));
	q.push(sou), lay[sou] = 0;
	while(!q.empty())
	{
		for(i = fst[q.front()], q.pop(); i != -1; i = nex[i])
			if(cap[i] > flow[i] && lay[v[i]] == -1)
			{
				lay[v[i]] = lay[u[i]] + 1;
				if(v[i] == ter)
					return 1;
				q.push(v[i]);
			}
	}
	return 0;
}
int dfs(int cur, int inc)
{
    if(cur == ter)
        return inc;
    for(int &i = work[cur]; i != -1; i = nex[i])
        if(flow[i] < cap[i] && lay[v[i]] == lay[cur] + 1)
            if(int t = dfs(v[i], inc < cap[i] ? inc : cap[i]))
            {
                flow[i] += t;
                flow[i ^ 1] -= t;
                return t;
            }
    return 0;
}
int dinic()
{
    int res = 0, t;
    memset(flow, 0, sizeof(flow));
    while(bfs())
    {
        memcpy(work, fst, sizeof(fst));
		while(t = dfs(sou, inf))
            res += t;
    }
    return res;
}
/********************网络流 ********************/

void MakeAns()
{
	sou = fa(0);
	while(T --)
	{
		scanf("%d", &ter);
		ter = fa(ter);
		if(sou == ter)
			printf("No solution!\n");
		else
			printf("%d\n", dinic());
	}
}
			
int main()
{
	while(scanf("%d%d%d%d%d", &M, &N, &L, &K, &T) != EOF)
	{
		init();
		ReadGraph();
		MakeAns();
		printf("\n");
	}
	return 0;
}

 

Problem I: Big party

Time Limit: 5 Sec  Memory Limit: 256 MB SUBMIT: 20  Solved: 5

Description

 鸡姨和刚妈 正准备下个周末的Party。他们想邀请很多的朋友,其中有很多男生,也有很多女生,大家一起交流感情。她们家中有很多桌子,其中有一个很大圆桌,大家都要到这个圆桌上来玩。但是 鸡姨和刚妈 现在不知道如何分配座次,这是为什么呢?据说当有超过K个女孩座位相邻(即这些女孩的座位是连续的,中间没有男孩)的话,她们就会说一整晚的话而不和其他人聊天,男生们会因此很寂寞,也达不到Party的目的。鸡姨和刚妈 没有其他选择,只有求助她们的好朋友Ziwen。

问题简化成如下:
N个人围绕着圆桌坐着,其中一些是男孩,另一些是女孩。你的任务是找出所有合法的方案数,使得不超过K个女孩座位是连续的。
当然,需要注意的是这个桌子是个圆的,循环同构会被认为是同一种方案。

Input

第一行有一个数T,表示以下有T组数据,每组数据有两个整数N,K(N,K<=2000)。每组数据之间有一个空行隔开。

Output

输出T行,每行顺次对应一组测试数据。
每组数据你需要输出最后的方案数除以100000007的余数。

Sample Input

33 13 34 1

Sample Output

243

HINT

 
第一组数据的方案是:MMM,MMW (M是男孩, W是女孩)。
 
第二组数据的方案是:MMM,MMW,MWW,WWW。
 
第三组数据的方案是:MMMM, MMMW,MWMW。
 
#include<iostream>
#include<cstdio>
using namespace std;

const int MaxN=2000;
const long long ModNum=100000007;

long long P[MaxN+1][MaxN+1],R[MaxN+1],Pow[MaxN+1],Ans;
int Loo,Loop,N,K;

long long ModExp(long long Base,long long T)
{
	if(T==0)
		return 1;
	long long Res=ModExp(Base,T>>1);
	Res=(Res*Res)%ModNum;
	if((T&1)==1)
		Res=(Res*Base)%ModNum;
	return Res;
}

void First()
{
	for(int i=1;i<=MaxN;i++)
		Pow[i]=ModExp(i,ModNum-2);
}

void Init()
{
	scanf("%d%d",&N,&K);
	K=min(K,N);
}

void Work()
{
	int i,j;
	P[1][0]=1;
	for(i=1;i<N;i++)
	{
		P[i+1][0]=0;
		for(j=0;j<=K;j++)
		{
			P[i+1][0]=(P[i+1][0]+P[i][j])%ModNum;
			P[i+1][j+1]=P[i][j];
		}
	}
	for(i=1;i<=N;i++)
		for(j=0;j<=K;j++)
			P[i][j]=(P[i][j]*(j+1))%ModNum;
	for(i=1;i<=N;i++)
	{
		R[i]=0;
		for(j=0;j<=K;j++)
			R[i]=(R[i]+P[i][j])%ModNum;
	}
	if(K>=N)
		Ans=1;
	else
		Ans=0;
	for(i=1;i<=N;i++)
		if((N%i)==0)
		{
			for(j=2*i;j<=N;j+=i)
				R[j]=(R[j]-R[i]+ModNum)%ModNum;
			Ans=(Ans+R[i]*Pow[i])%ModNum;
		}
}

void Print()
{
	printf("%lld\n",Ans);
}

int main()
{
	First();
	scanf("%d",&Loop);
	for(Loo=1;Loo<=Loop;Loo++)
	{
		Init();
		Work();
		Print();
	}
	return 0;
}

 
 

Problem J: 飞鸽传书

Time Limit: 1 Sec  Memory Limit: 128 MB SUBMIT: 37  Solved: 12

Description

     很久很久以前,有一位将军被派到前线指挥战斗。前线离都城很遥远,将军希望使用信鸽向都城汇报战况。

    但当时的信鸽不能单独飞行如此遥远的距离,因此将军在后方的营地安排了一位联络员,营地离前线很近,离都城很远。信鸽可以单独从前线飞到营地,但不能单独从营地飞到都城。
    为了解决这个问题,营地的联络员收到从前线飞来的信鸽后,不会让信鸽单独飞到都城,而是让它留在营地,等营地有了一定数量的信鸽后,将这一批信鸽组成一个队伍,一起飞往遥远的都城。团结才是力量,为了让信鸽在飞往都城的遥远的路途中不至于迷失,每一批至少要有k只信鸽一起飞行。
    整个战斗预计要持续N分钟,N是奇数。将军已和联络员约定,从战斗开始起计时,对于第t分钟(t表示从战斗开始起计时的分钟数,取值为[0,N-1], 战斗开始时t=0,第N-1分钟过后战斗结束),如果(t^a)%N==b(t^a表示t的a次方),则将军在第t分钟立即从前线放出一只信鸽飞往营地汇报最新的战斗进展。将军带着m只供放飞的信鸽到了前线,前线离营地非常近,可以认为从将军放出的信鸽会立刻到达营地。但由于营地必须让信鸽分批飞到都城,信鸽可能会被暂时留在营地,因此会延误一些战况的汇报。
    当然,联络员希望,这个延误的时间越少越好。如果一只信鸽在t1时刻从前线放飞并到达营地,但是t2时刻才从营地起飞飞往都城,则因扣留在营地引起的延时是t2-t1。联络员是很聪明的,他希望设计一个分批放飞的策略,让所有信鸽的总延时尽可能少。
例如,如果战斗预计持续时间N=13 分钟,将军在和联络员约定了a=4,b=3。则将军按照在(t^a)%N==b(t的a次方除N的余数等于b)时刻t放飞信鸽的策略,将军在第2、3、10、11这4个时刻放出一共4只信鸽,这些信鸽一放出就立即到达营地。如果信鸽至少要k=2个为一批一起才能远程飞行,联络员可以选择在第3分钟让第1、2只信鸽作为一组飞往都城,第11分钟让第3、4只信鸽作为一组飞往都城,这样总延迟是2分钟(第1、3只信鸽各延迟1分钟)。
    联络员想知道的问题是:
    1.按照将军在(t^a)%N==b时刻放飞信鸽的计划,在整个N分钟的战斗中应该有多少只信鸽被发送?
    2.如果联络员按照最好的分组方法把这些信鸽分批飞往都城,那么所有的信鸽被扣留在营地造成的总延迟最少是多少?
    当然可能会有以一些情况导致将军的汇报计划不能完成,比如它总共放出的信鸽数量还不足编为一组(要发出的总信鸽数<k),又或者将军带去的供发送的信鸽数不够(要发出的总信鸽数>m)。

Input

     第一行一个整数T(1<=T<=50),表示数据的组数。

    接下来T组测试数据每个一行,包括5整数:
    N (3<=N<1000,000,000,且N为奇数),表示战斗将持续的总分钟数
    k (1<=k<=N),表示一组信鸽至少要k只才能长途飞行
    a (0<=a<N),将军与联络员约定的发送时刻t^a%N==b中的a
    b (0<=b<N),将军与联络员约定的发送时刻t^a%N==b中的b
   m (1<=m<=100,000),将军带去的供发送战况的信鸽总数。如果按照计划要发送的所有信鸽数多于这个值,则不能完成原有的汇报计划

Output

     每组测试数据输出一行,每行两个整数,第一个整数表示按照将军计划,将要发出的信鸽数量;第二个数表示信鸽被扣留在营地造成的最少总延迟(分钟数)。如果将军带去的信鸽数不够,第二个数输出-1;如果将军带去的信鸽足够,但营地无法将这些信鸽分组发回都城,第二个数输出-2。如果按照将军的计划,根本不需要发送信鸽,仍然算是可以成功发送的,扣留的总延迟为0(两个数都输出0)。

Sample Input

5
13 2 4 3 10
125 2 2 25 100
225 10 60 1 1000
1517 100 7 103 10000
1000003 10 1000002 1 1000000

Sample Output

4 2
10 75
120 1020
1 -2
1000002 -1

HINT

 

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long U64;
const int MAXF = 16;
const int MAX_ANS = 100005;
int fact_val[MAXF];
int fact_cnt[MAXF];
int fact_pow[MAXF];
int ans_cnt[MAXF];
int ans_array[MAXF][MAX_ANS];
int g_fact_num, g_tot_cnt, g_n, g_k, g_m, g_a, g_b;
int china_x[MAXF], china_Mi[MAXF];
int S[MAX_ANS], A[MAX_ANS], g_final_p;
U64 sum[MAX_ANS], dp[MAX_ANS];
const int HZ = 43963;
const int MXB = 200000;
struct node
{
	int key;
	int val;
	node *next;
};
node BUF[MXB], *BP;
node *hash[HZ];
int pow_mod(int a, int b, int n)
{
	int res = 1;
	while (b)
	{
		if (b & 1)
			res = (U64) res * a % n;
		a = (U64) a * a % n;
		b >>= 1;
	}
	return res;
}
int ext_gcd(int a, int b, int &x, int &y)
{
	int t, res;
	if (b == 0)
	{
		x = 1, y = 0;
		return a;
	}
	res = ext_gcd(b, a % b, x, y);
	t = x, x = y, y = t - a / b*y;
	return res;
}
int primitiv_root(int p)
{
	int res, i, arr[20], fn = 0, phi = p - 1;
	for (i = 2; i * i <= phi; i++)
	{
		if (phi % i == 0)
		{
			arr[fn++] = i;
			while (phi % i == 0)
				phi /= i;
		}
	}
	if (phi > 1)arr[fn++] = phi;
	for (res = 2; res < p; res++)
	{
		for (i = 0; i < fn; i++)
			if (pow_mod(res, (p - 1) / arr[i], p) == 1)
				break;
		if (i >= fn)
		{
			if (res % 2 == 0)
				res += p;
			if (pow_mod(res, p - 1, p * p) == 1)
				res += 2 * p;
			break;
		}
	}
	return res;
}
inline void insert(int key, int val)
{
	int k = key % HZ;
	BP->key = key;
	BP->val = val;
	BP->next = hash[k];
	hash[k] = BP++;
}
inline int find(int key)
{
	for (node *p = hash[key % HZ]; p != NULL; p = p->next)
	{
		if (p->key == key)
			return p->val;
	}
	return -1;
}
int log_mod(int a, int b, int n, int phi_n)
{
	int i, e, T, iv, v, x, y;
	if (b == 1)return 0;
	T = (int) (sqrt((double) phi_n) + 1.0);
	iv = pow_mod(a, T, n);
	ext_gcd(iv, n, x, y);
	v = (x + n) % n;
	memset(hash, 0, sizeof (hash));
	BP = BUF;
	for (e = 1, i = 0; i < T; i++)
	{
		if (find(e) != -1)
			break;
		insert(e, i);
		e = ((long long) e * a) % n;
	}
	for (i = 0; i < T; i++)
	{
		if ((e = find(b)) != -1)
			return i * T + e;
		b = ((long long) b * v) % n;
	}
	return -1;
}
int calc_all_atom()
{
	int idx;
	g_tot_cnt = 1;
	for (idx = 0; idx < g_fact_num; idx++)
	{
		int a = g_a, b = g_b % fact_pow[idx], p = fact_val[idx];
		if (b == 0)
		{
			int temp_a = pow_mod(p, (fact_cnt[idx] + a - 1) / a, g_n);
			ans_cnt[idx] = fact_pow[idx] / temp_a;
			g_tot_cnt *= ans_cnt[idx];
			if (g_tot_cnt > g_m)
			{
				continue;
			}
			for (int i = 0; i * temp_a < fact_pow[idx]; i++)
			{
				ans_array[idx][i] = i*temp_a;
			}
		} else
		{
			int g = __gcd(b, fact_pow[idx]);
			int log_g = 0;
			while (pow_mod(p, log_g, g_n) != g)log_g++;
			if (log_g % a != 0)
			{
				return (g_tot_cnt = 0);
			}
			int ans_ext_fact = pow_mod(p, log_g / a, g_n);
			int temp_b = b / g;
			int temp_mod_base = fact_pow[idx] / g;
			int phi_base = temp_mod_base - temp_mod_base / p;
			int temp_a, x, y;
			temp_a = ext_gcd(a, phi_base, x, y);
			if (pow_mod(temp_b, (phi_base) / temp_a, temp_mod_base) != 1)
			{
				return (g_tot_cnt = 0);
			}
			ans_cnt[idx] = temp_a * (g / ans_ext_fact);
			g_tot_cnt *= ans_cnt[idx];
			if (g_tot_cnt > g_m)continue;
			temp_b = pow_mod(temp_b, x + phi_base, temp_mod_base);
			int ans, step;
			if (temp_a == 1)
			{
				ans = temp_b;
				step = 1;
			} else
			{
				int r = primitiv_root(p) % temp_mod_base;
				int log_b = log_mod(r, temp_b, temp_mod_base, phi_base);
				ans = pow_mod(r, log_b / temp_a, temp_mod_base);
				step = pow_mod(r, phi_base / temp_a, temp_mod_base);
			}
			for (int i = 0; i * ans_ext_fact < g; i++)
			{
				for (int j = 0; j < temp_a; j++)
				{
					ans_array[idx][i * temp_a + j] = (ans + i * temp_mod_base) * ans_ext_fact;
					ans = (U64) ans * step % temp_mod_base;
				}
			}
		}
	}
	return g_tot_cnt;
}
void ana(int n)
{
	g_fact_num = 0;
	for (int i = 3; i * i <= n; i += 2)
	{
		if (n % i == 0)
		{
			fact_val[g_fact_num] = i;
			fact_cnt[g_fact_num] = 0;
			fact_pow[g_fact_num] = 1;
			do
			{
				n /= i;
				fact_cnt[g_fact_num]++;
				fact_pow[g_fact_num] *= i;
			}
			while (n % i == 0);
			g_fact_num++;
		}
	}
	if (n > 1)
	{
		fact_val[g_fact_num] = n;
		fact_pow[g_fact_num] = n;
		fact_cnt[g_fact_num++] = 1;
	}
}
void china_dfs(int deep, int res)
{
	for (int i = 0; i < ans_cnt[deep]; i++)
	{
		U64 x = china_x[deep];
		int Mi = china_Mi[deep];
		int mi = fact_pow[deep];
		int nres = (res + (x * (U64) ans_array[deep][i] % mi) * Mi) % g_n;
		if (deep == g_fact_num - 1)
		{
			A[g_final_p++] = nres;
		} else
		{
			china_dfs(deep + 1, nres);
		}
	}
}
void calc_final_ans()
{

	int i, x, y;
	for (i = 0; i < g_fact_num; i++)
	{
		china_Mi[i] = g_n / fact_pow[i];
		ext_gcd(china_Mi[i], fact_pow[i], x, y);
		china_x[i] = (x + fact_pow[i]) % fact_pow[i];
	}
	g_final_p = 0;
	china_dfs(0, 0);
}
inline double slope(int x, int y)
{
	return ((double) dp[y] + (double) sum[y] - (double) dp[x] - (double) sum[x]) / (y - x);
}
U64 dp_solve(int n, int k)
{
	int i, t, L = 0, R = -1;
	sort(A, A + n);
	sum[0] = A[0];
	for (i = 1; i < n; i++)
	{
		sum[i] = A[i] + sum[i - 1];
	}
	for (i = k - 1; i < n && i < k + k - 1; i++)
		dp[i] = A[i]*(U64) (i + 1) - sum[i];
	for (; i < n; i++)
	{
		while (L < R && slope(S[R - 1], S[R]) >= slope(S[R], i - k))R--;
		S[++R] = i - k;
		while (L < R && slope(S[L], S[L + 1]) < A[i]) L++;
		t = S[L];
		dp[i] = dp[t] + A[i]*(U64) (i - t)-(sum[i] - sum[t]);
	}
	return dp[n - 1];
}
int main()
{
	int t;
	U64 res;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d%d%d%d%d", &g_n, &g_k, &g_a, &g_b, &g_m);
		ana(g_n);
		calc_all_atom();
		if (g_tot_cnt == 0)
		{
			res = 0;
		} else if (g_tot_cnt > g_m)
		{
			res = -1;
		} else if (g_tot_cnt < g_k)
		{
			res = -2;
		} else
		{
			calc_final_ans();
			res = dp_solve(g_tot_cnt, g_k);
		}
		printf("%d %lld\n", g_tot_cnt, res);
	}
	return 0;
}


 

写个打印结构体所有成员的偏移:typedef struct OWS_SHD_CTRL_CMD { unsigned short header1;//帧起始标志 固定为0x5555 固定为0x5555 unsigned short header2;//帧起始标志 固定为0xAAAA 固定为0xAAAA unsigned short dppsn; //数据处理序列 0~65535,顺序增加,发一帧加1 数据处理填 0~65535,顺序增加,发一帧加1 unsigned short len;//32位数据长度 1024 固定 1024 unsigned char packetType; //B7~B0 数据包类型 "0x10:工作数据包; unsigned char bak; //B15~B8 备份 "数据处理填 /* 0x30:初始化数据包; 0x40:空包(用于DBF状态回读) " "0x10:工作数据包; 0x30:初始化数据包; 0x40:空包(用于DBF状态回读) " */ unsigned short rcsn;//雷控序列 0~65535 雷控填 0~65535 unsigned char year; // 6 1 B15~B8 月 值域:[1,12] 雷控填 值域:[1,12] unsigned char month; // B7~B0 年 值域:[0,99] 雷控填 值域:[0,99] unsigned char day; // 7 1 B15~B8 时 值域:[0,23] 雷控填 值域:[0,23] unsigned char hour; // B7~B0 日 值域:[1,31] 雷控填 值域:[1,31] unsigned char minute; // 8 1 B15~B8 秒 值域:[0,59] 雷控填 值域:[0,59] unsigned char second; // B7~B0 分 值域:[0,59] 雷控填 值域:[0,59] unsigned short us100;//秒以下单位 秒以下,单位:100us 雷控填 秒以下,单位:100us unsigned char testMode : 4;// unsigned char taskMode : 4;// /*B7~B4 任务模式 "0x0:工作模式(不监测) 0x1:发监测; 0x2:收监测; 0x3:模拟目标测试; 注:当要使用模拟目标时必须要控制模拟目标模式,频率源响应此字决定是否输出模拟目标 " "0x0:工作模式(不监测) 0x1:发监测; 0x2:收监测; 0x3:模拟目标测试; 注:当要使用模拟目标时必须要控制模拟目标模式,频率源响应此字决定是否输出模拟目标 "*/ unsigned char workMode;//B15~B8 工作模式 "0x00:工作模式A(工作模式0) unsigned char bak103; // B7~B0 备份 unsigned char bitMode;// /* 11 1 B15~B8 BIT工作方式 "0x00:开机测试; 0x01:在线测试(全机);0x02:在线测试(DBF);0x03:在线测试(备份);0x04:在线测试(信处理);0x05:在线测试(数据处理); 0x06:在线测试(光传与控制);0x07:在线测试(频率源);0x08:在线测试(伺服);0x09:在线测试(电源);0x0A:在线测试(阵面冷却); 0x0B:反干扰前记录数据的回放;0x80:外码元;0x81:全阵面数据采集;0x82:数字单元BITE传送;0x83:备份; " "0x00:开机测试; 0x01:在线测试(全机);0x02:在线测试(DBF);0x03:在线测试(备份);0x04:在线测试(信处理);0x05:在线测试(数据处理);0x06:在线测试(光传与控制); 0x07:在线测试(频率源);0x08:在线测试(伺服);0x09:在线测试(电源);0x0A:在线测试(阵面冷却); 0x0B:反干扰前记录数据的回放; 0x80:外码元; 0x81:全阵面数据采集; 0x82:数字单元BITE传送; 0x83:备份; " */ unsigned short bak1; //备份 unsigned short pitch; //阵面姿态 默认阵面倾角 资源调度或显控填 默认阵面倾角 unsigned short txBeamEle;//发射波束指向 量化单位0 .1° 资源调度或显控填 量化单位0.1° unsigned short rxBaseBeamEle;//本帧接收的最低一个俯仰波束指向 -2°~90°,量化单位0 .1° 资源调度或显控填 -2°~90°,量化单位0.1° unsigned short rxEleNum;//本帧俯仰同时接收波束个数(有效波束数) 俯仰面同时接收波束个数,0X011个;…0X05:5个;…0X0A:10个;…0x14:20个 资源调度或显控填 俯仰面同时接收波束个数,0X011个;…0X05:5个;…0X0A:10个;…0x14:20个 unsigned short rxEleStep;//本帧接收的俯仰波束间隔 0~5°,量化单位0 .01° 资源调度或显控填 0~5°,量化单位0.1° unsigned short bak2; //备份 unsigned short sweepNum; //波位总数 当前工作模式一共多少个波位 资源调度填 unsigned short beamPos; //当前波位 当前为第几个波位 资源调度填 unsigned short scanBeamTxEle;//波瓣测试发射仰角 角度值*100 显控填 角度值*100 unsigned short scanBeamRxEle;//波瓣测试接收仰角 角度值*100 显控填 角度值*100 unsigned short bak3; //备份 unsigned short srvAzA; //伺服A方位角码 960伺服双机热备,所以有两个方位角码,需与张宏超沟通更改程序 雷控填 960伺服双机热备,所以有两个方位角码,需与张宏超沟通更改程序 unsigned short srvAzB; //伺服B方位角码 雷控填 unsigned short bak4[5]; //备份 unsigned char workMod;// /*32 K 1 B7~B0 工作模式 "0x80: 正常工作模式 0x91: 发射监测模式 0x92: 接收监测模式 0xEA: DDS复位、BIT总清 0xCC:指令BIT参数回读(见BIT回读)(b7~b0为0xCC时进行指令BIT参数回读,其他模式则为周期BIT回读) " 阵面控制工作模式总览 "0x80: 正常工作模式 0x91: 发射监测模式 0x92: 接收监测模式 0xEA: DDS复位、BIT总清 0xCC:指令BIT参数回读(见BIT回读)(b7~b0为0xCC时进行指令BIT参数回读,其他模式则为周期BIT回读) "*/ unsigned char bak5; //B15~B8 备份 保留、填0 保留、填0 unsigned short antType; //阵面重构类型 保留、填0 阵面重构类型选择 保留、填0 unsigned char bak6; unsigned char freqNum:3;//频率分集分组循环参数 unsigned char freqREn : 1;//频率分集分组循环参数使能 unsigned char bakold : 4;//频率分集分组循环参数 unsigned short calEn : 1; //35 K+3 1 b0 天线阵面发射相位、接收幅度、相位补偿使能 0:补偿 1:不调用补偿值///////(单元级用本bit)0 "补偿使能开关 unsigned short subAntEn : 1;//b1 阵面级收发通道接收幅度加权旁路使能 "0:使能 1:不调用补偿值///////(子阵级用本bit)1 /* 接收做组件内DBF时相应此字,如不调用补偿,则对八个通道数据不进行幅度加权,如调用补偿,则进行幅度加权,加权信息对应96字b5-b8及之后波束对应字 " "0:使能 1:不调用补偿值///////(子阵级用本bit)1 接收做组件内DBF时相应此字,如不调用补偿,则对八个通道数据不进行幅度加权,如调用补偿,则进行幅度加权,加权信息对应96字b5-b8及之后波束对应字 " */ unsigned short antTxW : 1;// b2 天线阵面发射展宽 0:展宽 1:不展宽 0 0:展宽 1:不展宽 0 unsigned short chlNorEn : 1; // b3 组件收发幅相归一化补偿使能。953首套置1,正常置0。 "0:归一化 1:不使能 9531测雨0 //暗室测试时为了取原始数据会置1,正常使用时置0 //组件级补偿,通常在微电子时会先烧好,如果一个产品各个组件的组件级补偿烧好了,那么B0代表的阵面级补偿就只补偿组件以外的东西,这样的好处是组件故障后可以直接更换,如不烧组件级补偿,那组件更换后要再进行阵面补偿 " "0:归一化 1:不使能 9531测雨0 //暗室测试时为了取原始数据会置1,正常使用时置0 " unsigned short actChlEn : 1; //b4 数字通道均衡旁路使能 保留、填0 保留、填0 unsigned short actChlEn2 : 1; //b5 数字时延处理旁路使能 保留、填0 保留、填0 unsigned short actChlEn3 : 1; //b6 DDC窄带频率分集旁路使能,除A模式外其他模式置1 0:无频率分集;1有频率分集 0:无频率分集;1有频率分集 unsigned short actChlEn4 : 1; //b7 数字时延误差补偿旁路使能 保留、填0 保留、填0 unsigned short powerMngEn : 1; //b8 能量管理码 调用使能 Q "0:调用能量管理 1:不调用能量管理 0 与96字(及之后的几个发射脉冲字段)的能量管理类型,即开单极化或双极化关联。置0时能量管理类型字有效,置1时无效" unsigned short bak7 : 3; //b11~b9 备份 保留、填0 保留、填0 unsigned short baktxPhaseSig : 1; //b12 发射频移极性 保留、填0 保留、填0 unsigned short bakrxPhaseSig : 1; //b13 接收频移极性 保留、填0 保留、填0 unsigned short txPhaseSig : 1; //b14 发射移相极性 控制发射移相正反,1,0 保留、填0 unsigned short rxPhaseSig : 1; //b15 接收移相极性 保留、填0 保留、填0 // unsigned short subdbf : 4; //36 K+4 1 b3~b0 数字板打包选择 "0x0:不进行组件内DBF合成; //unsigned short subdbfEn:1;//0x4:进行组件DBF合成,0x4 =4通道合1;(953,2201) //unsigned short doubleFreqEn:1;//0x8:按频率分集,8通道合1;(中南S) unsigned short waveCode : 2; //b5~b4 码元控制 0:AD,1:码元1 0:AD,1:码元1 unsigned short iqRev : 1; //b6 IQ正反 "960此处有效,可用来调试,正常填0,如发现下行数据IQ反了,则可置1将它再反过来 unsigned short bak8 : 1; //b7 备份 备份 备份 unsigned short dbf : 3; //b10~b8 DBF打包输出选择 "0:按b3-b0设置执行DBF或不合成; /* 1:保留 2:合成单通道模式,仅被字39选择单通道移相,加权输出。 其余保留。 正常工作时置0,置2是为了验证当组件内DBF合成时各通道幅度相位加权的正确性的,即:当b3-b0置8时,此处可置2,置2后根据39字的设置选择单独下行某一个通道的加权结果,而不是8通道加权合一的结果,进行验证。正常工作时不需置2 . " "0:按b3-b0设置执行DBF或不合成; 1:保留 2:合成单通道模式,仅被字39选择单通道移相,加权输出。 其余保留。 正常工作时置0,置2是为了验证当组件内DBF合成时各通道幅度相位加权的正确性的,即:当b3-b0置8时,此处可置2,置2后根据39字的设置选择单独下行某一个通道的加权结果,而不是8通道加权合一的结果,进行验证。正常工作时不需置2 . " */ unsigned short externWaveCode : 1; //b11 外码元 "0x1:外码元 0x0:IQ数据 unsigned short packetMode : 3; //b14~b12 打包模式 "0x0:中心频点IQ数据打包 /* 0x1:接收5分集40通道IQ数据打包 0x2:合成模式打包(打包合成后5通道,可配合合成单通道模式) " "0x0:中心频点IQ数据打包 0x1:接收5分集40通道IQ数据打包 0x2:合成模式打包(打包合成后5通道,可配合合成单通道模式) " */ unsigned short exWaveCode : 1; //b15 外码元 0x1:外码元 0x0:IQ数据 0x1:外码元 0x0:IQ数据 unsigned short paraChl0; //参数提取单通道数据下传选择阵面ID 保留、填0 保留、填0 unsigned short paraChl1; //参数提取单通道数据下传选择阵面ID 保留、填0 保留、填0 unsigned short paraChl2; //参数提取选择通道(组件内DBF功能) "可下传0~N-1中任一单个数字通道的加权结果,N代表数字组件数字通道数,当且仅当36字:b11~b8为2时起效 //此字为测试用,当36字b11-b8置2时,根据此字的数值选择使组件单独下传数值对应通道的加权结果,用于组件内DBF合成验证,正常工作时不使用此字,置0即可 " 组件内DBF模块负载实现 "可下传0~N-1中任一单个数字通道的加权结果,N代表数字组件数字通道数,当且仅当36字:b11~b8为2时起效 //此字为测试用,当36字b11-b8置2时,根据此字的数值选择使组件单独下传数值对应通道的加权结果,用于组件内DBF合成验证,正常工作时不使用此字,置0即可 " unsigned short bak9[2]; //备份 保留、填0 保留、填0 unsigned short ddcfir : 4;//42 K+10 1 B3~B0 DDC FIR滤波器带宽/采样率 0x0:1M/2M 0x1: 2M/2M 0x2:4M/4M DDC采样滤波器选择 0x0:1M/2M 0x1: 2M/2M 0x2:4M/4M unsigned short bak10 : 12;// unsigned short bak11[12]; //备份 保留、填0 保留、填0 unsigned short stc : 6;//b5~b0 数字组件接收衰减 "b4-b0有效,b0代表1dB衰减,b1代表2dB衰减,以此类推,b4代表16dB衰减,衰减范围0-31dB 1:不衰减 0:衰减 例如:11110(二进制),代表衰减1dB unsigned short stcMethod : 1; //b6 数字组件衰减控制方式选择 0:从上述指令中选取 1:衰减可变(从可变STC字段选取) 0:从上述指令中选取 1:衰减可变(从可变STC字段选取) unsigned short txForce : 1; //b7 发射强制开启 保留、填0 保留、填0 unsigned short bak21 : 1; //b8 中频滤波器选择 保留、填0 保留、填0 unsigned short bak22 : 1; //b9 DDS声表滤波器选择 保留、填0 保留、填0 unsigned short bak23 : 1; //b10 中频发射直通选择 保留、填0 保留、填0 unsigned short bak24 : 1; //b11 本振切换 保留、填0 保留、填0 unsigned short bak25 : 1; //b12 宽窄带滤波器控制 保留、填0 保留、填0 unsigned short txFilterSel : 3; //b15~b13 射频滤波器选择 "B15:收发射频滤波器设置方式切换,目前根据频点分为两种滤波器,频点0-124为滤波器1,频点125-300为滤波器2。0:根据96字(及之后几个发射脉冲对应字)b7的设置切换,1:手动根据b14-b13的值切换。 /* 正常使用时b15置0,这样可以对每个发射脉冲根据频率单独设置滤波器,更加灵活。要进行相关测试时可以置1进行手动切换统一使用一种滤波器 B14-B13:手动设置滤波器,B15为1时生效。00:滤波器1,01:滤波器2 " "B15:收发射频滤波器设置方式切换,目前根据频点分为两种滤波器,频点0-124为滤波器1,频点125-300为滤波器2。0:根据96字(及之后几个发射脉冲对应字)b7的设置切换,1:手动根据b14-b13的值切换。 正常使用时b15置0,这样可以对每个发射脉冲根据频率单独设置滤波器,更加灵活。要进行相关测试时可以置1进行手动切换统一使用一种滤波器 B14-B13:手动设置滤波器,B15为1时生效。00:滤波器1,01:滤波器2 " */ unsigned short stcIndex; //STC曲线 保留、填0 保留、填0 unsigned short bak54[3]; //备份 保留、填0 保留、填0 unsigned int basePulseWidth; //基带信脉宽 保留、填0 保留、填0 unsigned short txOff; //发射关断模式字 关断时,填写0x9A,其余时刻不填。 "用来在调试时对模拟前端的收发、自激、拖尾进行检测。 //正常工作时不用 " 9x5不用,960应该也不用 关断时,填写0x9A,其余时刻不填。 unsigned short trunOffID; //关断或开启通道的用户ID[15:0] 要关断或开启的通道用户ID(开启时,若为0xFFFFFFFF,则全阵开,否则是单板开) 要关断或开启的通道用户ID(开启时,若为0xFFFFFFFF,则全阵开,否则是单板开) unsigned short trunOffID2;//关断或开启通道的用户ID[31:0] unsigned short trunOffChlNum; //关闭通道 1-16通道,分别对应b0~b15,0x1代表关断 1-16通道,分别对应b0~b15,0x1代表关断 unsigned char rxSelfExcitTh;//B7~B0 接收自激检测门限 0x0-0x90:对应1-90dB;0x0时默认为80dB; 0x0-0x90:对应1-90dB;0x0时默认为80dB; unsigned char txTrailTh;//B15~B8 发射拖尾检测门限 0x0-0x90:对应1-90dB;0x0时默认为80dB; 0x0-0x90:对应1-90dB;0x0时默认为80dB; unsigned short rxSelfExcitEn : 1; //b0 接收自激检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short rxSelfExcitS : 1; //b1 接收自激检测判别方法 0x0:绝对门限法,0x1:相对门限法 0x0:绝对门限法,0x1:相对门限法 unsigned short rxSelfExcitChlEn : 1; //b2 接收自激异常通道关断方式 0x0:手动,0x1:自动 0x0:手动,0x1:自动 unsigned short rxSelfExcitStaRet : 1; //b3 接收自激状态复位 0x0:保持原状,0x1:关断通道恢复开启 0x0:保持原状,0x1:关断通道恢复开启 unsigned short rxSelfExcitExcFlagEn : 1; //b4 接收自激异常标志清除 0x0:保持原状,0x1:标志清除 0x0:保持原状,0x1:标志清除 unsigned short rxSelfExcitDtcStartPos : 4; //b8~b5 接收自激检测起始位置(从波门起始开始算起,步进500us) 0:500us;1:1ms;···14:7 .5ms;15:0ms(监测时用) 0:500us;1:1ms;···14:7.5ms;15:0ms(监测时用) unsigned short rxSelfExcitChlDiffThl : 3;//b11~b9 接收自激检测通道间差异阈值 "0x0:30dB;0x1:27dB;0x2:24dB; //0x3:21dB;0x4:18dB;0x5:15dB; //0x6:12dB;0x7:9dB; " "0x0:30dB;0x1:27dB;0x2:24dB; //0x3:21dB;0x4:18dB;0x5:15dB; //0x6:12dB;0x7:9dB; " unsigned short adRevDtcEn : 1; // b12 AD翻转检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short adRevDtcSel : 1; //b13 AD翻转检测方式 0x0:高位,0x1:全部 0x0:高位,0x1:全部 unsigned short txTrailEn : 1; //b14 发射拖尾检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short txTrailExFlagEn : 1; //b15 发射拖尾异常标志清除 0x0:保持原状,0x1:标志清除 0x0:保持原状,0x1:标志清除 unsigned short checkSum; //校验码 关断或开启时,填写0xaa55,其余时刻不填。 关断或开启时,填写0xaa55,其余时刻不填。 unsigned short bak53[2];//备份 无 无 unsigned short bakpulseWidth;//脉冲宽度 无 无 unsigned short rxFeqNco[10][2]; //由低到高依次为:接收分集NCO1的 低16位 高16位, NCO2 ...NCO10 "前5个频点为第一组 /*中频-奈奎斯特最大值 " "10个NCO字, 接收频率分集使能时起效,每个NCO字为32BIT, 72-73是频率分集1; NCO =((480-实际接收中频频率)/120)*2^32 实际接收中频频率计算方式: 频率 =接收本振-回波频率 " "前5个频点为第一组 中频-奈奎斯特最大值 "*/ RCV_BEAM_PARA DBF_beta[10];//0水平,1 垂直,然后10个表示10个角度的beta码。由低到高分别是水平波束1 2 3 10。,然后是垂直极化的波束1 2 3 10。 unsigned short beta[2][10]; //备份 unsigned short bak12[16]; //备份 unsigned short mnBak[4]; //MN预留 unsigned int txCalChlID;//发射监测模式下被监测数字组件用户ID[15:0] "发射监测时选定阵面数字组件,接收监测时填写0xFFFF? //根据用户ID,字32选发射监测,即可对对应ID的数字组件进行发射监测 " 监测选定数字组件,接收监测时填写0xFFFF,选中用户ID,字32选发射,即可发射 unsigned short txCalChlSet;//发射监测模式下被监测数字组件数发射通道设置 发射监测时选定数字组件的发射通道,0-7代表1-8通道 监测选定数字组件,接收监测时填写0xFFFF unsigned short txCalAntID; //监测子阵波控板用户ID[15:0] 保留,备份 保留,备份 unsigned short txCalAnalogChl; //监测有源子阵内模拟通道 保留,备份 保留,备份 unsigned short txCalDigitalChl; //监测组件发射数字通道 保留,备份 保留,备份 unsigned short mntADFalg : 1; //1 B0 监测:数字/模拟链路 缺省填1,数字组件 缺省填1,数字组件 unsigned short mntHVFalg : 2; // b2~b1 监测极化控制 保留,填0 保留,填0 unsigned short mntCalPAStat : 2; // b4~b3 监测通道幅相置位状态 保留,填0 保留,填0 unsigned short mntCalCalTxRxStat : 2; // b6~b5 监测通道收发状态 保留,填0 保留,填0 unsigned short bak13 : 9; // b15~b7 备份 保留,填0 保留,填0 unsigned short calCoefAddr : 8;//200 R+12 1 B7~B0 监测频率对应的补偿地址 "当字32选择发射监测或接收监测时,要想调用补偿值,在此字调用的补偿值,调用方法同字94 unsigned short calCoefAddr2 : 8; // B15~B8 补偿地址备份 unsigned short bak14[10]; //备份 unsigned short bak15; //备份 保留,备份 保留,备份 unsigned short calTRMod;//监测组件工作模式 "监测组件工作模式:接收内监测0x0002 接收外监测0x0040 发射内监测0x0000 发射外监测0x8000 /*监测组件工作模式: 外接收监测0x0009 外发射监测0x0010 内接收监测0x000c 内发射监测0x0090 模拟目标0x800a 噪声源0x4000 匿影0x0000 其余保留,缺省为匿影 "*/ unsigned short calTRAtten : 7; // B6~B0 监测组件发射衰减值 监测组件发射衰减0-XXXdB,单位1dB 只需直接填入想要衰减的值即可,具体衰减实现由组件内部根据填入的值自适应进行 "b6~b0:模拟目标衰减 unsigned short simTgtFreq : 2;//b9~b7:模拟目标频率选择 其余保留 " unsigned short calTRTxFreqSel : 7; // B14~B8 监测组件发射频率段索引 "同一衰减下,监测组件在不同发射频率下其衰减补偿值不同,此字段用来选择监测组件发射频率段索引,对应不同衰减补偿值 //将301个频点按4M划分(以除以四后四舍五入为准则),分为76个频率段,用0-75表示,0代表频点0、1对应频率,1代表2、3、4、5对应频率,以此类推 " "设此频率段索引为F,监测组件发射频率为f,则此字段填入 //F =四舍五入(f/4) " unsigned short stc1Value : 5;// B4~B0 监测组件接收衰减控制STC1 b4:1 =16dB衰减,b3:1=8,b2:1=4,b1:1=2,b0:1=1, STC1控制0-31dB衰减,STC2控制0-31 .5dB衰减,两者可叠加 b4:1=16dB衰减b3:1=8,b3:1=8,b2:1=4,b1:1=2,b0:1=1, unsigned short bak42 : 3;//b5-b7 备份 保留置0 1开,0关 unsigned short stc2Value : 6;// b8-b13 监测组件接收衰减控制STC2 b13:1 =16dB衰减,b12:1=8,b2:11=4,b1:10=2,b9:1=1,b8:1=0 .5 1关,0开 unsigned short bak43 : 1;//b14 备份 保留置0 1关,0开 unsigned short bak44 : 1; //b15 备份 保留置0 保留置0 unsigned short bak45 : 7; //b15~b8 备份 保留,填0 保留,填0 unsigned int calTRID; //监测参考数字组件阵面ID[15:0] 保留,填0 保留,填0 unsigned short calTRCalNum; //监测参考数字组件数字通道 保留,填0 保留,填0 unsigned short bitModSel : 8;// B7~B0 BIT模式选择 "0x7:数字收发BIT //(字32:0xCC时,为指令BIT参数回读,其他模式则为周期BIT回读) " "0x7:数字收发BIT //(字32:0xCC时,为指令BIT参数回读,其他模式则为周期BIT回读) " unsigned short bitSubModSel : 8; //b15~b8 BIT模式子集选择 "工作模式为0xCC指令BIT参数回读 unsigned short txrxBitMod : 8; //b7~b0为0x7数字收发BIT模式 /*0x0:数字通道全局列坐标M 0x1:数字通道全局行坐标N 0x2:模拟通道全局列坐标M 0x7F: 厂家ID及FLASH信息 0x81:数字收发时钟链路、光链路工作状态 0x83:指令接收状态 0x91:数字收发接收通道工作状态 0x92:数字收发发射通道工作状态 0x93:数字收发AD寄存器数据回读 0x94:数字收发DA寄存器数据回读*/ unsigned int bitParaAddr;//参数BIT回读地址[15:0] unsigned short readCalNum : 8; // b7~b0 回读通道数 unsigned short readCeofAddr : 8; // b15~b8 回读补偿地址数(频点数/点数/阶数) unsigned short dbfCtrlBit[4];//波控指令BIT控制字(详见右) 指令BIT控制[15:0] 指令BIT控制[15:0] unsigned short bak46[16]; //备份 备份 备份 unsigned short cycleFreqNum2;//循环二接收本振频点(FR2) 0-200;9300~9500MHz,1MHz一个点,共201个 0-200;9300~9500MHz,1MHz一个点,共201个 unsigned short cycleFreqNum1;//循环一接收本振频点(FR1) 0-200;9300~9500MHz,1MHz一个点,共201个 0-200;9300~9500MHz,1MHz一个点,共201个 unsigned char clockSel; //B7~B0 晶振选择(频率源A) 0:自发自收 1:自关收外 暂不使用 0:自发自收 1:自关收外 unsigned char clockWaveNum; //B15~B8 波形个数(频率源A) 0x1~0xA =1~10 0xB:发连续波 暂不使用 0x1~0xA=1~10 0xB:发连续波 PULSE_PARA pulsePara[10];/*0x1:1MHz; 0x2:2MHz;0x3:4MHz; " "0:0(单载频);0x1:1MHz; 0x2:2MHz;0x3:4MHz; "*/ unsigned short bak30[15]; //备份 unsigned short dbfMode; //DBF工作模式 "0x40:光纤和网络送出波束数据(波瓣测试用) /*0x80:正常工作(正常工作用) 0x90:窄带接收内监校 0x91:窄带接收外监校 0x92:发射内监校 0x93:发射外监校 0x96:扫描架接收监校 0xc2:阵面BIT回读 0xc3:基本通道参数回读 0xc4:频点参数回读 0xc6:锥削权索引回读 0x65:基本通道参数加载 0x67:锥削权索引加载 0x68:频点参数加载 0x75:基本通道参数固化 " "0x40:光纤和网络送出波束数据(波瓣测试用) 0x80:正常工作(正常工作用) 0x90:窄带接收内监校 0x91:窄带接收外监校 0x92:发射内监校 0x93:发射外监校 0x96:扫描架接收监校 0xc2:阵面BIT回读 0xc3:基本通道参数回读 0xc4:频点参数回读 0xc6:锥削权索引回读 0x65:基本通道参数加载 0x67:锥削权索引加载 0x68:频点参数加载 0x75:基本通道参数固化 "*/ unsigned short workPara : 2; // B1~B0 工作参数 00:常规工作;01:步进频方式;10:远近区方式;11:频率分集 0:单频点; 1:多频点补盲;2:暂无;3:频率分集。无需填写 00:常规工作;01:步进频方式;10:远近区方式;11:频率分集 unsigned short WNFlag : 1;// B2 宽窄带标志 宽窄带标志,1:数据率>120M,0:数据率≤120M 无需填写 宽窄带标志,1:数据率>120M,0:数据率≤120M unsigned short bak49 : 1;//B3 备份 无 无 unsigned short rngSegment : 4;//B7~B4 远近区距离段数 最大4段 无需填写 最大4段 unsigned short freqMutiN : 4;// B11~B8 多频点频点数 最大40 无需填写 最大40 unsigned short bak50 : 1;//B12 备份 无 无 unsigned short collectSel : 2; // B14~B13 阵面数据采集 "11:采集波束数据 10:采集加权后数据 //01:采集原始通道数据 00:不采集(在工作状态时采集各通道的一些数据用于监测) " 无需填写 "11:采集波束数据 10:采集加权后数据 //01:采集原始通道数据 00:不采集(在工作状态时采集各通道的一些数据用于监测) " unsigned short bak51 : 1;// B15 备份 无 无 unsigned int dataLen; //数据包长度[15:0] "BIT校验用,不影响工作(BIT要填)填不填都不影响正常工作,但如果填错了BIT会报错" /* 数据包长度[31:16] "本帧数据的回波脉冲长度,脉冲积累数*单个脉冲距离库数*频点数 GH模式下,频点数为:G:5;H:3;单个脉冲距离库数为:采样率*(第一周期波门长度+第二周期波门长度) 脉冲积累数取665字设置的值 " 本帧数据的回波脉冲长度,脉冲积累数X波束数X单个脉冲距离库长 */ unsigned short pulseNum; //脉冲总数(本帧数据的脉冲个数) 8~512脉冲积累数 "BIT校验用,不影响工作(BIT要填) //填不填都不影响正常工作,但如果填错了BIT会报错 " 8~512脉冲积累数 unsigned int sampStart; //采集起始计数点数[15:0] "从该点数开始抽取32个点在网络转发,用于监测,正常工作不影响 //代点数,而不是时间,例如填50(十进制),则意味着DBF在其收到的数据的第50点开始,抽取32点转发 " 用于监测,正常工作不影响采集起始计数点数[31:16] 从这个点开始抽取64点,用于监测和查错 unsigned short dbfused; //DBF专用字段 unsigned short dbfOffset; //阵面子阵合成后选用的DBF参数偏移 阵面合成填16,不合成填8 本产品内已写死,无需填写 新增 阵面合成填16,不合成填8 unsigned short bak16; unsigned short freqSegment; //跳频段数 "GH模式,长短脉冲跳频,两组时分补盲循环填2 //其他无时分补盲,填1 " "GH模式,长短脉冲跳频,两组时分补盲循环填2 //其他无时分补盲,填1 " unsigned char dataRate : 4;//B0~B3 数据率 1:2bps,2:2bps;3:4bps 1:2bps,2:2bps;3:4bps unsigned char workMode2 : 4;//B4~B7 工作模式 A:1;B:2;C:3;D:4;E:5;F:6;G:7;H:8 F和G模式下,只处理2bps数据率;4bps由阵面做一级DBF; A:1;B:2;C:3;D:4;E:5;F:6;G:7 unsigned char bak17; unsigned short bak18[5]; unsigned char oneLineChlNum; //B7~B0 输入单根光纤通道数 频率分集,填1无需填写 按照实际填写,频率分集:填1 .无需填写 频率分集,填1无需填写 unsigned char dbfBeamNum; //B15~B8 合成波束数 无需填写 A/D/E模式:24/12;F/G模式:4/2;无需填写 unsigned char oneLineDbfNum; //B7~B0 DBF合成过程中输出单根光纤通道数 未定义 与B7~B0定义相同 unsigned char oneLineAfterDbfNum; //B15~B8 DBF对下一级输出单根光纤通道数 A/D/E模式:24/12;F/G模式:4&times;5频率/2&times;5频率; unsigned short bak19[3]; unsigned short freqIndex[10]; //频点索引,DBF计算回波alpha,beta值计算 频点索引:频点序:从0起。 频点索引,DBF计算回波alpha,beta值计算 unsigned short freqIndex11to40[30];//频点11~频点40 BEAM_AZEL beamAngle[96]; //波束2到波束96方位、俯仰指向 unsigned char deamDbfCeof[96]; //B7~B0 波束1~96的锥削权索引 "权值索引的b6,b14代表了水平/垂直权,其中1为垂直0为水平 /*权值,而b0~b5或b8~b13则为权值;权值需要阵面预先烧好,其中相同权值的不同极化权值相同 以上1垂直0水平的实现方式其实还是通过权值实现,换句话说,b0-7、b8-15都是指代权值套数,b6和b14本身也是权值套数的一部分。例如b7-0为‘0x40’的时候指的是该波束为垂直极化,并且用第0套权值,但实际烧权值的时候,该套权值是烧在地址64,即‘0x40’的十进制上的,在该套权值中,水平组件对应用户ID下的权值均为0,只有垂直组件对应ID下各通道的权值为想要的权值,通过这种方式来实现水平和垂直的切换。 所以可以不遵守以上规律,可自行更改,但为了统一,除非权值套数非常多,否则以后可都遵守此规律 " "权值索引的b6,b14代表了水平/垂直权,其中1为垂直0为水平 权值,而b0~b5或b8~b13则为权值;权值需要阵面预先烧好,其中相同权值的不同极化权值相同 "*/ unsigned short dbfbak[60]; //DBF字段备份 unsigned short jambak[18]; //反干扰字段 unsigned short timeingEn : 1; //B0 定时使能 0:关闭,仅产生数据处理中断和雷控默认定时;1:开启 0:关闭,仅产生数据处理中断和雷控默认定时;1:开启 unsigned short bak52 : 15; //B15~B1 备份 unsigned int timeingSwitch; // 定时 每一位:0:关闭;1:开启 每一位:0:关闭;1:开启 unsigned short simTgtTime;//模拟目标模拟触发位置 "0 .1us单位,0~6553.5us //>接收波门起始,<接收波门结束 " 模拟目标的带宽和脉宽可以设 "0 .1us单位,0~6553.5us //>接收波门起始,<接收波门结束 " unsigned short pulseWidth;//脉冲宽度 1us单位,最大1 .5ms 保留,暂不使用 1us单位,最大1.5ms unsigned short pulseNum0;//填零脉冲数(距离模糊倍数) 0~20个 0~20个 unsigned short startSampTime; //时分脉冲1接收波门起始(1us) 1us 单位 1us 单位 unsigned short endSampTime; //时分脉冲1接收波门结束(1us) 1us 单位 1us 单位 unsigned short calStartSampTime;//监测组件接收波门起始(1us) 5 5 5 unsigned short calEndSampTime;//监测组件接收波门结束(1us) aa 170 aa unsigned short cancelStartSampTime;//对消采样波门起始 相对M0的提前时刻(us) 相对M0的提前时刻(us) unsigned short cancelEndSampTime;//对消采样波门结束 相对M0的提前时刻(us) 相对M0的提前时刻(us) unsigned short bak20; //备份 unsigned short simTgtFd : 15;//B14~B0 模拟目标fd,单位1Hz ±3661Hz ±3661Hz unsigned short simTgtsign : 1;//B15 符位,0为减去fd,1为加上fd unsigned short simTgtAtten;//模拟目标衰减 0~100dB 不启用 0~100dB unsigned short txPulseNum; //发射脉冲数(8~512个) unsigned short PRT; //(100us~65ms)(1us) 所有时分周期求和 所有时分周期求和 unsigned short pulse2Start;//时分P2周期起始时刻(1us) unsigned short pulse3Start;//时分P3周期起始时刻(1us) unsigned short pulse2RxStart;//时分P2周期接收波门起始(1us) unsigned short pulse2RxEnd;//时分P2周期接收波门结束(1us) unsigned short pulse3RxStart;//时分P3周期接收波门起始(1us) unsigned short pulse3RxEnd;//时分P3周期接收波门结束(1us) unsigned short calTxRxEn : 2; // B1~B0 内外监测发射开关 "bit0:内监测,1:开,0:关闭(监测组件2通道) unsigned short bak121 : 14; //B15~B2 备份 unsigned short bak1232;//备份 匿影天线低噪放控制 unsigned short bak123[6];//备份 无 无 unsigned short dspMode;//信处理工作方式 0:自检 1:RESET 2:工作 3:直通(时域IQ) 0:自检 1:RESET 2:工作 3:直通(时域IQ) unsigned short bak124;//备份 无 无 unsigned short method : 1;//B0 处理方式 0:FFT 1:PPP 0:FFT 1:PPP unsigned short points : 10; //B10~B1 FFT/PPP点数 8~512 与657字发射脉冲数相同 8~512 unsigned short winFun : 2; // B12~B11 FFT加权函数的选择 0:不加权 1:海明加权 2:Blackman加权 3:其他 0:不加权 1:海明加权 2:Blackman加权 3:其他 unsigned short pcFun : 2; //B14~B13 LFM脉压加权函数的选择 0:不加权 1:海明加权 2:Blackman加权 3:其他 0:不加权 1:海明加权 2:Blackman加权 3:其他 unsigned short pcPara : 1; //B15 脉压选择 0:不脉压 1:脉压 对窄脉冲无效,窄脉冲默认不脉压,默认填1即可,需要验证宽脉冲时填0 0:不脉压 1:脉压 unsigned short bak125; //备份 unsigned short beamNum;//总波束数 1~60 1~60 unsigned short phaseCodeEn : 3; //B15~B13 相位编码使能 0:不开启,1~7:对应1~7套相位编码 信处理算法标志 0:不开启,1~7:对应1~7套相位编码 unsigned short clutterProEn : 1; //B12 地杂波处理算法选择 0:手动;1:自适应 0:手动;1:自适应 unsigned short singleCompEn : 1; //B11形式补偿开关 0:关闭;1开启 0:关闭;1开启 unsigned short fsFilterEn : 1; //B10 飞机舰船滤波开关 0:关闭;1开启 0:关闭;1开启 unsigned short b2bSmoothEn : 1; //B9 帧内平滑开关 0:关闭;1开启 0:关闭;1开启 unsigned short beamSmoothEn : 1; //B8 帧间平滑开关 0:关闭;1开启 0:关闭;1开启 unsigned short antSyncEn : 1; //B7 反异步开关 0:关闭;1开启 0:关闭;1开启 unsigned short noPulseDelEn : 1; //B6 窄脉冲剔除开关 0:关闭;1开启 0:关闭;1开启 unsigned short sideEn : 1; //B5 副瓣对消开关 0:关闭;1开启 0:关闭;1开启 unsigned short hideEn : 1; //B4 副瓣匿影开关 0:关闭;1开启 0:关闭;1开启 unsigned short CCOREn : 1; //B3 CCOR开关 0:关闭;1开启 0:关闭;1开启 unsigned short SIGEn : 1; //B2 SIG开关 0:关闭;1开启 0:关闭;1开启 unsigned short LOGEn : 1; //B1 LOG开关 0:关闭;1开启 0:关闭;1开启 unsigned short SQIEn : 1; //B0 SQI开关 0:关闭;1开启 0:关闭;1开启 unsigned short SQIThl; //SQI门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short LOGThl; //LOG门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short SIGThl; //SIG门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short CCORThl; //CCOR门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short hideThl;//副瓣匿影门限 0~65535,100倍填写,单位:Db 0~65535,100倍填写,单位:Db unsigned char noPulseDelWidthThl; // B15~B8 窄脉冲剔除宽度门限 值域[0,255],量化单位1us,0:不剔除 窄脉冲剔除用 值域[0,255],量化单位1us,0:不剔除 unsigned char noPulseDelAmpThl; unsigned short antSyncThl; //反异步门限 反异步用 unsigned short noiseThl1;//信处理噪声门限1 0~1000 .00 int16,噪声功率nn1的倍数(噪声功率由信处理配置文件给出) 0~1000.00 unsigned short noiseThl2;//信处理噪声门限2 0~1000 .00 int16,噪声功率nn1的倍数(噪声功率由信处理配置文件给出) 0~1000.00 unsigned short noiseThl3;//信处理噪声门限3 0~1000 .00 int16,噪声功率nn1的倍数(噪声功率由信处理配置文件给出) 0~1000.00 unsigned short b2bSmooths; //帧间平滑点数 11000,奇数 3*3的有效数小于此值填无效值,否则填有效数据之和的平均数 11000,媸? unsigned short beamSmooths; //帧内平滑点数 11000,奇数 11000,奇数 unsigned short groundClutterVelThl;//地杂波速度门限 0-5000,100倍量化,int16,单位是m/s 地杂波处理算法选择为手动时起效 0-5000,100倍量化,int16,单位是m/s unsigned short groundClutterWiodthThl;//地杂波谱宽门限 0-5000,100倍量化,int16,单位是m/s 0-5000,100倍量化,int16,单位是m/s unsigned short groundClutterRngThl;//地杂波距离门限 0-500,无量化,int16,单位是km 0-500,无量化,int16,单位是km unsigned short bak31;//备份 无 无 unsigned short doubFreqPro : 2; //B1~B0 双重频算法选择 0:单重频;1:双重频;2:重频复用 单重频时填0 0:单重频;1:双重频;2:重频复用 unsigned short doubFreqFlag : 2; // B3~B2 双重频标志 其它:否;1:是,第一帧;2:是,第二帧 单重频时填0 其它:否;1:是,第一帧;2:是,第二帧 unsigned short doubFreqType : 2;//B5~B4 双重频比 0—1:11—2:3;2—3:4;3—4:5 单重频时填0 0—1:11—2:3;2—3:4;3—4:5 unsigned short bak32 : 10;//B15~B6 备份 无 无 unsigned short bak33[27]; //备份 unsigned short txPhaseCtrl[127];//发射脉冲相位控制 (所需相位值(度))/360&times;2^16 int16,相位编码用 (所需相位值(度))/360&times;2^16 unsigned short bak34[13];//备份 无 无 unsigned short p1_20Start[20];//脉冲1~20 首库库(相对M0)零库 波束1~20 标定零库库(相对M0) int16 波束1~20 标定零库库(相对M0) unsigned short p1_10Start[20];//脉冲110 起始库(距离拼接用) int16 unsigned short p1_10End[20];//脉冲110 结束库(距离拼接用) int16 unsigned short p1_20End[20];//脉冲1~20 库数(距离拼接用) int16 unsigned short b2bRngAdd; //距离拼接(波束之间) 0:不启用 1:启用 0:不启用 1:启用 unsigned short burstNum;//有效波束数 1~60 1~60 unsigned short rangUnit;//库长 0~65535 0:150m;1:75m;2:37 .5m 0~65535 unsigned char noiseTestsn;// unsigned char noiseTestsn2;// unsigned short testStart : 1; // 1 B1~B0 测试起始标志 unsigned short testSn : 15; //B2~B15 测试序列 unsigned short compEn; //补偿开关 备用 备用 unsigned short bak35[49];//备用 无 无 unsigned short txEle; //发射仰角 角度&times;100 "波瓣测试时用; //正常工作时,资源调度填写和解析给RCM不同发射仰角用 " 角度&times;100 unsigned short rxEle;//接收仰角 角度&times;100 波瓣测试时用,接收数据在dbf前先根据此值移相,再波束合成,这样可以画不同指向的方向图(即此值为方向图角度横轴,方向图样式由前面dbf字段的beta码和锥削权决定) 角度&times;100 unsigned short bak37; unsigned short bak38; unsigned int checkSum16; //校验和L 16累加 16累加 unsigned short tail1;//帧结束标志 固定为0x55AA 结束标志 固定为0x55AA unsigned short tail2;//帧结束标志 固定为0xAA55 结束标志 固定为0xAA55 }OWS_SHD_CTRL_CMD;
07-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值