【结论】大河的序列

LinkLink

luoguluogu P4144P4144

DescriptionDescription

大河有一些袜子,但经常十分散乱的堆放着。

有一天龙儿忍不住了,于是将袜子放到了一个序列上(称作袜子序列)。
在序列里,找一段连续子序列,使得所有数字的按位与加上按位或最大。

InputInput

第一行三个整数 n,b,pn,b,p ,分别表示数列长度和输出相关的东西

第二行有 nn 个整数,表示这个数列的初始数值

OutputOutput

设答案为 xx ,你需要输出 (x+233)b(x+233)^b modmod pp

SampleSample InputInput

10 1 10000000
7 9 9 4 0 0 8 8 4 7

SampleSample OutputOutput

 251

HintHint

1<=n,p<=1051 <= n,p <= 10^5
0<=b,dirty[i]<=1070 <= b,dirty[i] <= 10^7
对于测试点 11 和测试点 22 的数据,保证 1n1001≤n≤100

TrainTrain ofof ThoughtThought

其实这道题可以通过推到得出结论:
xx当前已找到最优序列,现在找到一个新的数yy,若将yy插入序列,运算到dirty[x]dirty[x]的第ii位与dirty[y]dirty[y]的对应位时,可分以下情况
1.dirty[x][i]==1dirty[x][i] == 1,此时,若dirty[y][i]dirty[y][i]11,则没有变化,若dirty[y][i]dirty[y][i]00,则会更差(与运算变为0,或运算不变)
2.dirty[x][i]==0dirty[x][i] == 0,此时,若dirty[y][i]dirty[y][i]11,则会加到11,若dirty[y][i]dirty[y][i]00,则不变
四种情况中,只有一种能加到,而且加了之后,只对xx有好处,对yy则毫无益处(不会使得值更优)
因此,我们只选择一个数。
要选择一个数,那么肯定选择最大的数,进行运算后,就是这个数的2倍,最后再按题意进行处理
所以,题目最终解法就是:
ans=max(dirty[i])2ans = max(dirty[i]) * 2 加上题目要求的输出处理

CodeCode

#include<cstdio> 
#include<iostream>
using namespace std;
int n, b, p, maxn;
int a[100005];
int Counting(int x, int y, int p)
{
	int ans = 1;
	x = x % p;
	while (y)
	{
		if (y & 1) 
			ans = (long long) ans * x % p;
		x = (long long) x * x % p;
		y /= 2;
	}
	return ans;
}//快速幂
int main()
{
	scanf("%d%d%d", &n, &b, &p);
	for (int i = 1; i <= n; ++i)
	{
		scanf("%d", &a[i]);
		maxn = max (a[i],maxn);
	}
	maxn *= 2;
	if (p == 1) printf("0");
	 else printf("%d", Counting(maxn + 233, b, p));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章