CDOJ 1048 Bob's vector(快速幂+三分法)

题目大意:原题链接

给定数组A[i]的计算方法,求出其任意一个极值点

解题思路:求极值点用三分法,一般计算100次足矣,所以三分时上限为100,不过运行时间可能会长一点

   用for循环

   用while循环

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7; 
int n,m;
long long x[500010],b[1010];

long long Quickpow(long long a,long long b)
{
    long long res=1;
    a%=mod;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return res;
}
long long Get_Ai(int id)
{
    if(id==0) return -1e9;
    if(id==n+1) return -1e9;
    long long res=0;
    for(int i=1;i<=m;i++)
        res=(res+b[i]*Quickpow(x[id],i))%mod;
    return res; 
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%lld",&x[i]);
    for(int i=1;i<=m;i++)
        scanf("%lld",&b[i]);
    int l=1,r=n;
    while(l<r-10){//或者for(int i=0;i<100;i++) 
        int midl=l+(r-l)/3;
        int midr=r-(r-l)/3;
        long long p1=Get_Ai(midl);
        long long p2=Get_Ai(midr);
        if(p1>p2) r=midr;
        else l=midl;
    }
    for(int i=l;i<=r;i++){
        if(Get_Ai(i)>Get_Ai(i-1)){
            if(Get_Ai(i+1)<Get_Ai(i)){
                printf("%d\n",i);
                return 0;
            }
        }
    }
} 

 

posted @ 2017-03-04 20:58  despair_ghost  阅读(234)  评论(0编辑  收藏  举报