Description–
大河有一些袜(mei)子(zhi),但经常十分散乱的堆放着。
有一天龙儿忍不住了,于是将袜子放到了一个序列上(称作袜子序列)。
每个袜子都有一个dirtydirtydirty值,定义袜子序列的dirtydirtydirty值为
表示 第 i i i 只袜子 的 dirty dirty dirty 值,bitandbitandbitand表示按位与(C++中是&),bitorbitorbitor表示按位或(C++中是|)。
简而言之,就是找一段连续子序列,使得所有数字的按位与加上按位或最大。
如果这个袜子序列的dirtydirtydirty值达到了某个阈值,那么龙儿会讨厌大河的。
大河当然不希望这样了,于是她想知道这个袜子序列的dirtydirtydirty值是多少。
Input–
第一行三个整数 n,b,p n,b,p n,b,p ,分别表示数列长度和输出相关的东西
第二行有 n n n 个整数,表示这个数列的初始数值
Output–
设答案为 x x x ,你需要输出 (x+233)bmodp (x+233)^{b} ,, \text{mod} ,,p (x+233)bmodp
Sample Input–
10 1 10000000
7 9 9 4 0 0 8 8 4 7
Sample Output–
251
说明–
解题思路–
在我们要找的子序列中其实“&|”的结果最大的是单个最大的那个数
代码–
#include<iostream>
#include<cstdio>
using namespace std;
int n,b,p,x,s,ans;
int power(int a)//快速幂
{
int ss=1%p;
for (;b;b>>=1)
{
if (b&1) ss=(long long)ss*a%p;
a=(long long)a*a%p;
}
return ss%p;
}
int main()
{
scanf("%d%d%d",&n,&b,&p);
for (int i=1;i<=n;++i)
scanf("%d",&x),s=max(s,x);
ans=power(s+s+233);//第一个s是‘&’的结果,第二个是‘|’的
printf("%d",ans);
return 0;
}
来源:https://blog.csdn.net/qq_43654542/article/details/98753456