大河有一些襪子,但經常十分散亂的堆放着。
有一天龍兒忍不住了,於是將襪子放到了一個序列上(稱作襪子序列)。
在序列裏,找一段連續子序列,使得所有數字的按位與加上按位或最大。
第一行三個整數 ,分別表示數列長度和輸出相關的東西
第二行有 個整數,表示這個數列的初始數值
設答案爲 ,你需要輸出
10 1 10000000
7 9 9 4 0 0 8 8 4 7
251
對於測試點 和測試點 的數據,保證
其實這道題可以通過推到得出結論:
設當前已找到最優序列,現在找到一個新的數,若將插入序列,運算到的第位與的對應位時,可分以下情況
1.,此時,若爲,則沒有變化,若爲,則會更差(與運算變爲0,或運算不變)
2.,此時,若爲,則會加到,若爲,則不變
四種情況中,只有一種能加到,而且加了之後,只對有好處,對則毫無益處(不會使得值更優)
因此,我們只選擇一個數。
要選擇一個數,那麼肯定選擇最大的數,進行運算後,就是這個數的2倍,最後再按題意進行處理
所以,題目最終解法就是:
加上題目要求的輸出處理
#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));
}