【結論】大河的序列

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));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章