Advertisement
leanchec

pratos.cpp

Oct 8th, 2024
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5.  
  6. const int mod=1000000007;
  7.  
  8. bool comp(pair<int,int> a, pair<int,int> b){
  9.     return a.first*b.second+a.second<b.first*a.second+b.second;
  10. }
  11.  
  12. int fast_exp(int base, int exp){
  13.     if(exp==0)return 1;
  14.     if(exp==1)return base;
  15.  
  16.     int aux=fast_exp(base, exp/2);
  17.     aux=(aux*aux)%mod;
  18.     if(exp&1)aux=(aux*base)%mod;
  19.  
  20.     return aux;
  21. }
  22.  
  23. int32_t main(){
  24.     ios_base::sync_with_stdio(0); cin.tie(0);
  25.     int n, m, k;
  26.     cin >> n >> m >> k;
  27.     vector<pair<int,int>> feiticos(n);
  28.  
  29.     for(int i=0; i<n; i++){
  30.         cin >> feiticos[i].first;
  31.     }
  32.  
  33.     for(int i=0; i<n; i++){
  34.         cin >> feiticos[i].second;
  35.     }
  36.  
  37.     vector<pair<int,int>> refeicoes(m);
  38.  
  39.     for(int i=0; i<m; i++){
  40.         cin >> refeicoes[i].first;
  41.     }
  42.  
  43.     for(int i=0; i<m; i++){
  44.         cin >> refeicoes[i].second;
  45.     }
  46.  
  47.     sort(feiticos.begin(), feiticos.end());
  48.     sort(refeicoes.begin(), refeicoes.end(), comp);
  49.  
  50.     int prod=1, soma=0;
  51.     for(auto x:refeicoes){
  52.         prod=(prod*x.first)%mod;
  53.         soma=(soma*x.first+x.second)%mod;
  54.     }
  55.  
  56.     vector<pair<int,pair<int,int>>> limiar;
  57.  
  58.     limiar.push_back({0, feiticos[0]});
  59.  
  60.     for(int i=1; i<n; i++){
  61.         int mn=0;
  62.         while(limiar.size()){
  63.             int a1=(limiar.back().second.second-feiticos[i].second+feiticos[i].first-limiar.back().second.first-1), a2=(feiticos[i].first-limiar.back().second.first);
  64.             if(a2==0){
  65.                 limiar.pop_back();
  66.                 continue;
  67.             }
  68.             mn=a1/a2;
  69.             if(mn<=limiar.back().first)limiar.pop_back();
  70.             else break;
  71.         }
  72.         limiar.push_back({mn, feiticos[i]});
  73.     }
  74.  
  75.     vector<pair<int,int>> pot2(30);
  76.     pot2[0]=feiticos.back();
  77.     for(int i=1; i<30; i++){
  78.         int a=pot2[i-1].first, b=pot2[i-1].second;
  79.         pot2[i]=make_pair((a*a)%mod, (a*b+b)%mod);
  80.     }
  81.  
  82.     int q;
  83.     cin >> q;
  84.  
  85.     while(q--){
  86.         int val;
  87.         cin >> val;
  88.  
  89.         int qtd=k;
  90.  
  91.         while(qtd>0){
  92.             qtd--;
  93.             auto ptr=upper_bound(limiar.begin(), limiar.end(), make_pair(val, make_pair(mod, mod)));
  94.             ptr--;
  95.             int melhor=ptr-limiar.begin();
  96.             val%=mod;
  97.             val=(val*limiar[melhor].second.first+limiar[melhor].second.second);
  98.             if(melhor==limiar.size()-1)break;
  99.         }
  100.         val%=mod;
  101.  
  102.         for(int i=0; i<30; i++){
  103.             if(qtd&(1<<i)){
  104.                 val=(pot2[i].first*val+pot2[i].second)%mod;
  105.             }
  106.         }
  107.         val=(prod*val+soma)%mod;
  108.  
  109.         cout << val << '\n';
  110.     }
  111.  
  112.     return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement