题目列表:hdu5214~5223
5214:
当时第一反应是由递推公式推出通项公式,事实证明这就是作!大!死!
因为通项公式是这样的:L[n]=a^(n-1)*(b+L[1])-b
于是就需要快速幂。然而用了快速幂还是慢。。。【实际上是被卡在了7000ms多一点点。。。】
其实直接放到数组里一项一项递推就行。。速度并不慢还省事
另外本题还有一个point:被mod的那个数字很奇怪,所以直接用unsigned int存就行。不仅省空间还不用mod了(溢出相当于自动mod)
当时没想起来这个于是用了long long,于是数组存不下,于是T^T
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define LL unsigned int 5 //#define MOD 4294967296 6 using namespace std; 7 LL N,L1,R1,a,b,c,d,T; 8 LL ll[10000010],rr[10000010]; 9 LL li,ri; 10 11 int main() 12 { 13 scanf("%d",&T); 14 while(T--) 15 { 16 scanf("%d%d%d%d%d%d%d",&N,&L1,&R1,&a,&b,&c,&d); 17 ll[1]=L1; rr[1]=R1; 18 if(L1>R1) swap(L1,R1); 19 LL minl=L1,minr=R1,maxl=L1,maxr=R1; 20 for(LL i=2;i<=N;i++) 21 { 22 ll[i]=ll[i-1]*a+b; 23 rr[i]=rr[i-1]*c+d; 24 li=ll[i],ri=rr[i]; 25 if(li>ri) swap(li,ri); 26 if (ri<minr) 27 { 28 minl=li; 29 minr=ri; 30 } 31 if (li>maxl) 32 { 33 maxl=li; 34 maxr=ri; 35 } 36 } 37 bool ok=false; 38 //cout<<minl<<","<<minr<<" "<<maxl<<","<<maxr<<endl; 39 for(LL i=1;i<=N;i++) 40 { 41 li=ll[i]; ri=rr[i]; 42 if(li>ri) swap(li,ri); 43 //cout<<li<<","<<ri<<endl; 44 if((li>minr)&&(ri<maxl)) 45 { 46 ok=true; 47 break; 48 } 49 } 50 if (ok) printf("YES\n"); else printf("NO\n"); 51 } 52 return 0; 53 }