题目列表: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 }
View Code

相关文章:

  • 2022-12-23
  • 2021-09-25
  • 2021-07-28
  • 2021-09-04
  • 2021-04-23
  • 2021-07-08
  • 2021-08-11
猜你喜欢
  • 2022-12-23
  • 2021-04-28
  • 2021-10-02
相关资源
相似解决方案