大河有一些袜子,但经常十分散乱的堆放着。
有一天龙儿忍不住了,于是将袜子放到了一个序列上(称作袜子序列)。
在序列里,找一段连续子序列,使得所有数字的按位与加上按位或最大。
第一行三个整数 ,分别表示数列长度和输出相关的东西
第二行有 个整数,表示这个数列的初始数值
设答案为 ,你需要输出
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));
}