bzoj3613: [Heoi2014]南园满地堆轻絮 二分

这道题二分一下就可以了

虽然数据看起来过不了,但还是能过的

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline int read(){
    int x=0,f=1,ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n,sa,sb,sc,sd,mod;
inline int calc(int x){
	long long res=0;
	res+=(long long)sa*x%mod*x%mod*x%mod;
	res+=(long long)sb*x%mod*x%mod;
	res+=(long long)sc*x%mod;
	res+=sd;
    return res%mod;
}
int a[5000005];
inline bool ok(int x){
    int id=a[1]-x,i,l,r;
    for(i=2;i<=n;i++){
        l=a[i]-x;r=a[i]+x;
        if(id>r) return false;
        id=max(id,l);
    }
    return true;
}
int main(){
    n=read(),sa=read(),sb=read(),sc=read(),sd=read(),a[1]=read(),mod=read();
    a[1]%=mod;sa%=mod,sb%=mod,sc%=mod,sd%=mod;int i;
    for(i=2;i<=n;i++) a[i]=(calc(a[i-1])+calc(a[i-2]))%mod;
    int l=0,r=mod-1,mid;
    while(l<r){
        mid=(l+r)>>1;
        if(ok(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
    return 0;
}

  

 

posted @ 2017-02-25 09:51  古城独钓  阅读(322)  评论(0编辑  收藏  举报