1. 程式人生 > >l洛谷 (水題)P4144 大河的序列

l洛谷 (水題)P4144 大河的序列

col -o tro body ger ont 代碼 .org show

題目戳

Solution:

  這題前面都是廢話,關鍵的一句就是本題求的是序列中連續一段的相與值(&)+相或值(|)最大,然後對這個值進行快速冪取模。考慮到兩個數相與最大能得到的就是這兩個數中的最大值,兩個數相或最大能得到的也是這兩個數中的最大值,而題目中的連續一段可以是一個數,所以我們直接找出序列中的最大數。那麽,連續一段的相與值+相或值最大就是 最大數*2,然後對這個數快速冪取模就ok了。(註意:題目中b可以為0,按理說輸出是1,但是莫名其妙數據中要輸出0)

代碼:

 1 // luogu-judger-enable-o2
 2 #include<bits/stdc++.h>
 3
#define ll long long 4 #define il inline 5 using namespace std; 6 ll n,p,b,a[100005],num; 7 il void gi(ll &c) 8 { 9 c=0;char x=getchar();bool f=0; 10 while((x<0||x>9))x=getchar(); 11 while(x>=0&&x<=9)c=c*10+x-48,x=getchar(); 12 } 13 il ll fast(ll x,ll b)
14 { 15 ll a=1; 16 while(b){ 17 if(b&1)a=a*x%p; 18 b>>=1; 19 x=x*x%p; 20 } 21 return a; 22 } 23 int main() 24 { 25 gi(n),gi(b),gi(p); 26 if(b==0){printf("0");return 0;} 27 for(int i=1;i<=n;i++)gi(a[i]),num=max(a[i],num); 28 num<<=1
; 29 printf("%lld",fast(num+233,b)); 30 return 0; 31 }

l洛谷 (水題)P4144 大河的序列