Advertisement
Guest User

ICPC chennia 2023 B

a guest
Jan 20th, 2024
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | Source Code | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<queue>
  4. #include<string>
  5. using namespace std;
  6. const unsigned long long B = 1ll<<62;
  7. const int K = 1e6;
  8. const int mod = 998244353;
  9. struct num{
  10.     vector<unsigned long long> n;
  11.     num():n(1){}
  12.     void reduce(){
  13.         bool c = 0;
  14.         for(int i=0;i<n.size();++i){
  15.             n[i]+=c;
  16.             if(n[i]>=B){
  17.                 n[i]-=B;
  18.                 c = 1;
  19.             }
  20.             else{
  21.                 c = 0;
  22.             }
  23.         }
  24.         if(c){
  25.             n.push_back(1);
  26.         }
  27.     }
  28.     num(vector<unsigned long long> a){n=a;reduce();}
  29.     num& operator ++(){
  30.         n[0]++;
  31.         reduce();
  32.         return *this;
  33.     }
  34.     num operator +(const num &other)const{
  35.         vector<unsigned long long> temp = other.n;
  36.         temp.resize(max(temp.size(),n.size()));
  37.         for(int i=0;i<n.size();++i)
  38.             temp[i]+=n[i];
  39.         return num(temp);
  40.     }
  41.     bool operator < (const num& other)const{
  42.         if(n.size()!=other.n.size())return n.size()<other.n.size();
  43.         for(int i=n.size()-1;i>=0;--i){
  44.             if(n[i]!=other.n[i])return n[i]<other.n[i];
  45.         }
  46.         return false;
  47.     }
  48.     bool operator == (const num& other)const{
  49.         if(n.size()!=other.n.size())return false;
  50.         for(int i=n.size()-1;i>=0;--i){
  51.             if(n[i]!=other.n[i])return false;
  52.         }
  53.         return true;
  54.     }
  55.     void print(){
  56.         for(int i=n.size()-1;i>=0;--i){
  57.             cout<<n[i];
  58.         }
  59.         cout<<"\n";
  60.     }
  61. };
  62. struct node{
  63.     int base,digit;
  64.     num cur,add;
  65.     int gcur,gadd;
  66.     node(int _base):
  67.         base(_base),
  68.         digit(1),
  69.         cur(vector<unsigned long long>(1,1)),
  70.         add(vector<unsigned long long>(1,1)),
  71.         gcur(1),
  72.         gadd(1){}
  73.     bool operator < (const node&other)const{
  74.         return other.cur<cur;
  75.     }
  76.     node & operator ++ (){
  77.         ++digit;
  78.         cur = cur+add;
  79.         gcur+=gadd;
  80.         if(gcur>=mod){
  81.             gcur-=mod;
  82.         }
  83.         if(digit==base){
  84.             digit = 1;
  85.             ++cur;
  86.             add = cur;
  87.             ++gcur;
  88.             if(gcur==mod)gcur=0;
  89.             gadd = gcur;
  90.         }
  91.         return *this;
  92.     }
  93. };
  94. int main(){
  95.     ios_base::sync_with_stdio(false);
  96.     cin.tie(NULL);
  97.     num cur;
  98.     priority_queue<node> q;
  99.     for(int i=2;i<=16;++i){
  100.         q.push(node(i));
  101.     }
  102.     vector<int> pre(1);
  103.     for(int i=0;i<K;++i){
  104.         auto t = q.top();
  105.         q.pop();
  106.         if(cur==t.cur){
  107.             --i;
  108.         }
  109.         else{
  110.             cur = t.cur;
  111.             int x = pre.back()+t.gcur;
  112.             if(x>=mod)x-=mod;
  113.             pre.push_back(x);
  114.         }
  115.         ++t;
  116.         q.push(t);
  117.     }
  118.     int t;
  119.     cin>>t;
  120.     while(t--){
  121.         int k1,k2;
  122.         cin>>k1>>k2;
  123.         cout<<((pre[k2]-pre[k1-1]+mod)%mod)<<"\n";
  124.     }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement