【牛客7872 A】離散化-求一個數列第b項是第a項的多少倍
阿新 • • 發佈:2020-11-01
【牛客7872 A】離散化-求一個數列第b項是第a項的多少倍
題意
一個數列,初值為1,遞推公式為\(a[n]=a[n-1]*a[n-1]+a[n-1]\)
求第b項是第a項的多少倍,a和b的範圍是1e8,1e5組詢問
顯然可以初始處理出第1項~第1e8項的值(取模)
然後取我們需要的,取的這個過程需要離散化一下提高效率,把所有詢問到的點存在一個c數組裡,排個序,在初始處理的時候碰到這個數組裡的值就把這個答案記下來
初始化完成後就可以對每一組詢問計算答案即可
嗶嗶賴賴
據說還可以map搞一下,下次再說咕咕咕
Code
/**************************** * Author : W.A.R * * Date : 2020-10-31-22:27 * ****************************/ /* */ #include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<stack> #include<string> #include<set> #define IOS ios::sync_with_stdio(false) #define show(x) std:: cerr << #x << " = " << x << std::endl; #define mem(a,x) memset(a,x,sizeof(a)) #define Rint register int using namespace std; typedef long long ll; const int maxn=1e6+10; const int maxm=2e6+10; const ll mod=1e9+7; const double PI=acos(-1.0); const double eps=1e-7; ll qpow(ll a,ll n){a%=mod;ll ans=1;while(n){if(n%2)ans=ans*a%mod;n/=2;a=a*a%mod;}return ans;} ll a[maxn],b[maxn],c[maxn],ans[maxn]; int main(){ int T=read(),ct=0; for(int i=1;i<=T;i++)a[i]=read_ll(),b[i]=read_ll(),c[++ct]=a[i],c[++ct]=b[i]; sort(c+1,c+1+ct); ct=unique(c+1,c+1+ct)-c-1; show(ct); int index=1; ll x=1; for(int i=0;i<=1e8;i++){ if(i!=0)x=(x*x%mod+x%mod)%mod; if(index<=ct&&c[index]==i)ans[index]=x,index++; } for(int i=1;i<=T;i++){ if(a[i]>b[i])swap(a[i],b[i]); int fa=lower_bound(c+1,c+1+ct,a[i])-c; int fb=lower_bound(c+1,c+1+ct,b[i])-c; show(ans[fa]); show(ans[fb]); printf("%lld\n",ans[fb]*qpow(ans[fa],mod-2)%mod); } return 0; }