大河的序列【快速幂】

女生的网名这么多〃 提交于 2019-11-26 03:59:59

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!