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; } } } }