【纪中集训2019.3.29】整除分块

题目

描述

? 本题的背景是整除分块;

? 定义一个数列$a_{n,i} ? = ?\lfloor \frac{n}{i} \rfloor $ ;

? 求$\sum_{i=l}^{r} mex(a_n) $ ;

? 其中\(mex\)表示序列中最小的没有出现过的自然数;

? 答案对\(998244353\)取模 ;

范围

? \(1 \le T \le 65536 \ , \ 1 \le l ,r \le 10^{36}\) ;

? 评测系统支持使用 $ _ _ int218 $ ,但是不能直接读入输出,需要你手写 $ IO $ ;

题解

  • Part 1

  • 如果你写过整除分块,根据整除分块的写法基础,\(i\)在\(a_n\)中不出现的充要条件是:
    \[
    \begin{align}
    \lfloor \frac{n}{\lfloor \frac{n}{i} \rfloor} \rfloor \neq i \\
    \lfloor \frac{n}{\lfloor \frac{n}{i} \rfloor} \rfloor \ge i+1 \ \frac{n}{\lfloor \frac{n}{i} \rfloor} \ge i +1 \ \frac{n}{i+1} \ge \lfloor \frac{n}{i} \rfloor \\\ 令: \lfloor \frac{n}{i} \rfloor = a \结合上面的推导,根据定义有:\\\ a(i+1) \le n \lt i(a+1) \且在 0 \le a \lt i 时有意义;
    \end{align}
    \]
  • 意思是我们得到了关于不出现\(i\)的关于\(n\)的区间,记这样子的区间为\(S(i,a)\);
  • Part 2

  • 观察式子的左右两边,可以得到\(S(i+1,a-1)\)和\(S(i,a)\)可以拼接,推广得在同一副对角线上的区间连续:
  • 即这样的形式:
  • 记以\(S(i,0)\)开头的对角线标号为\(i\),按照标号,从小到大考虑每一条跳条对角线;
  • 注意到\(|S(i,a)| = i(a+1) - a(i+1) = i - a\);
  • 所以有:第\(i\)条线不会影响第\(1 \to i-1\)条线已经覆盖的区间的答案;
  • 发现多出来的区间长度依次是:$1 ?1 ?2 ?2 ?3 ?3 ? ? \cdots ? ? i ? i \cdots $ ;
  • 容易发现每一次的段都是从后往前看都是一个连续增大的数列(相邻差最大为1);
  • 对于第\(2i\)个多出来的区间,从后往前第一小段的长度为2,值为\(i\),以后值+1,长度+2,直到总长度为\(i\);
  • 对于第\(2i-1\)个多出来的区间,从后往前第一小段的长度为1,值为\(i\),以后值+1,长度+2,直到总长度为\(i\);
  • Part 3

  • 可以通过打表直接到\(Part \ 3\);
  • 分奇数段和偶数段求和,最后再删去剩下的一小段:
  • 对于奇数段:
    \[
    \begin{align}
    &= \sum_{i=1}^{l}\sum_{j=1}^{i} i + \sqrt{j-1}
    = \sum_{i=1}^{l} i^2 +\sum_{i=1}^{l} \sum_{j=1}^{i} \sqrt{j-1} \\to
    &\sum_{i=1}^{l} \sum_{j=1}^{i} \sqrt{j-1}= \sum_{j=1}^{l}\sqrt{j-1}(l-j+1)\&=\sum_{j=1}^{l}(l-j+1) \sum_{k=1}[k^2<j]= \sum_{k=1}^{k^2<l}\sum_{j=1}^{l-k^2}j\&直接运用等差数列求和再预处理次方和即可求得答案;
    \end{align}
    \]
  • 对于偶数段,可以不用求出\(k^2+k\)的逆,可以在奇数段的推导上直接得出:
    \[
    \begin{align}
    &\sum_{k=1}^{k^2+k<l}\sum_{j=1}^{l-k^2-k}j
    \end{align}
    \]

    //__int128真不是好东西,不仅不能直接读入开根还要炸精度!!!
    #include<bits/stdc++.h>
    #define mod 998244353
    #define eps 1e-9
    #define ll __int128
    #define ld long double
    #define il inline
    using namespace std;
    ll n,iv2,iv4,iv6,iv30;
    il char gc(){
      static char*p1,*p2,s[1000000];
      if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
      return(p1==p2)?EOF:*p1++;
    }
    il ll rd(){
      ll x=0;char c=gc();
      while(c<'0'||c>'9')c=gc();
      while(c>='0'&&c<='9')x=x*10+c-'0',c=gc();
      return x;
    }
    char ps[1000000],*pp=ps;
    il void push(char x){
      if(pp==ps+1000000)fwrite(ps,1,1000000,stdout),pp=ps;
      *pp++=x;
    }
    il void print(ll x){
      static int sta[100],top;
      if(!x){push('0'),push('\n');return;}
      while(x)sta[++top]=x%10,x/=10;
      while(top)push(sta[top--]^'0');
      push('\n');
    }
    il void flush(){fwrite(ps,1,pp-ps,stdout);}
    il ll pw(ll x,ll y){
      ll re=1;
      while(y){
          if(y&1)re=re*x%mod;
          y>>=1;x=x*x%mod;
      }
      return re;
    }
    il void inc(ll&x,ll y){x+=y;if(x>=mod)x-=mod;}
    il void dec(ll&x,ll y){x-=y;if(x<0)x+=mod;}
    il ll get1(ll n){
      //return floor(sqrt((ld)1.0*n)+eps);
      ll re=floor(sqrt((ld)1.0*n)+eps);
      while(re*re>=n)re--;
      return re;
    }
    il ll get2(ll n){
      //return floor((sqrt((ld)4.0*n-3)-1)/2+eps);
      ll re=floor((sqrt((ld)4.0*n-3)-1)/2+eps);
      while(re*re+re>=n)re--;
      return re;
    }
    il ll cal1(ll n){n%=mod;return n*(n+1)%mod*iv2%mod;}
    il ll cal2(ll n){n%=mod;return n*(n+1)%mod*(2*n+1)%mod*iv6%mod;}
    il ll cal3(ll n){n%=mod;return n*(n+1)%mod*n%mod*(n+1)%mod*iv4%mod;}
    il ll cal4(ll n){n%=mod;return n*(n+1)%mod*(2*n+1)%mod*(3ll*n*n%mod+3*n%mod+mod-1)%mod*iv30%mod;}
    il ll solve1(ll l){
      ll n=get1(l),re=0;
      inc(re,(n%mod)*(l%mod)%mod*(l%mod+1)%mod);
      dec(re,(2*(l%mod)+1)*cal2(n)%mod);
      inc(re,cal4(n));
      re=(re*iv2%mod+cal2(l)-1)%mod;
      return re;
    }
    il ll solve2(ll l){
      ll n=get2(l),re=0;
      inc(re,(n%mod)*(l%mod)%mod*(l%mod+1)%mod);
      dec(re,(2*(l%mod)+1)*cal1(n)%mod);
      dec(re,2*l*cal2(n)%mod);
      inc(re,2*cal3(n)%mod);
      inc(re,cal4(n)%mod);
      re=((re*iv2%mod+cal2(l))%mod+cal1(l))%mod;
      return re;
    }
    il ll solve3(ll l,ll n){
      ll m=get1(n),re=(n%mod)*(l%mod)%mod;
      inc(re,(m%mod)*(n%mod)%mod);
      dec(re,cal2(m));
      return re;
    }
    il ll solve4(ll l,ll n){
      ll m=get2(n),re=(n%mod)*((l%mod)+1)%mod;
      inc(re,(m%mod)*(n%mod)%mod);
      dec(re,cal2(m));
      dec(re,cal1(m));
      return re;
    }
    il ll solve(ll n){
      ll l=get2(n+1)+1,m=l*(l+1)-1,re=0;
      inc(re,solve1(l));
      inc(re,solve2(l));
      if(m>n)dec(re,solve4(l,min(l,m-n)));
      if(m-l>n)dec(re,solve3(l,min(l,m-n-l)));
      return re;
    }
    int main(){
      freopen("mex.in","r",stdin);
      freopen("mex.out","w",stdout);
      iv2=pw(2,mod-2);iv4=pw(4,mod-2);
      iv6=pw(6,mod-2);iv30=pw(30,mod-2);
      ll C=rd(),T=rd();
      while(T--){
          ll l=rd(),r=rd();
          ll ans=(solve(r)-solve(l-1)+mod)%mod;
          print(ans);
      }
      flush();
      return 0;
    }

原文地址:https://www.cnblogs.com/Paul-Guderian/p/10637349.html

时间: 2024-08-29 15:58:06

【纪中集训2019.3.29】整除分块的相关文章

【纪中集训2019.3.12】Mas的仙人掌

题意: ? 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: 题解: 考虑每一条边的贡献是\((1-p_{i})*\Pi_{j}p_{j}(j!=i)\),这里\(j\)和\(i\)不能同时加入: 一条加入的边可以看成一条树上路径 ,即求所有和路径\(i\)相交的路径\(j\)的\(p_{j}\)的乘积: 将一条树上的链\((u,v)\)拆成两条\((u,lca)\)和\((v,lca)\); 这样会

【纪中集训2019.08.20】【JZOJ6310】Global warming

题目链接 题意: 给出一个长度为$n$的序列$\{a_n\}$. 已知一个正整数$x$,你有一次机会指定区间$[l,r]$,令$\forall i\in [l,r],\;a_i=a_i+d\,(|d|\le x)$. 求最大化的最长上升子序列的长度. $1 \le n \le 2 \times 10^5 , \quad 1 \le a_i,x \le 10^9$且均为正整数. 分析: 可以很容易发现三个性质: 性质一:抬升$[l,r]$不优于抬升$[l,n]$,降低$[l,r]$不优于降低$[1

【纪中集训2019.3.20】河

题目 描述 给出\(n\)条河流,每条河流是形式为\(k_{i}x+b_{i}\)的一次函数且只有\(x\)轴正半轴的部分: 河流的污染部分和另外一条河流的干净部分交汇,干净的部分会被污染: 有若干个工厂要建在\(b_{i}\)处,问有多少种方案使得所有的河流在无穷远处被污染: 答案对\(1e9+7\)取模 范围 $1 \le N \le 5 \times 10^5 ? ?, ??|k_{i}|,|b_{i}| \le 10^9 $ 保证\(b_{i}\)互不相同: 题解 需要先找到可以被一条河

【纪中集训2019.08.21】【JZOJ6315】数字

题目链接 题意: 设$s(i)$为将$1\sim i$看做字符串后依次连接形成的串.给定正整数$n$,求最小的$i$使得$n$是$s(i)$的字串.$T$组数据. $n\le 10^{17}, \; t\le 10^4$ 分析: 不能模拟$s(i)$的组成过程来找答案,时间不能承受. 也不能预处理$s(k)$,空间不能承受. 那就只能在$n$上找答案. 以下把数字当成字面量来讨论,更方便. 同时,这里讨论的前缀和后缀不包括本身. 思考一下,答案分为三种: 1.$ans=n$ 2.$n$由$ans

纪中集训2019.11.06

A.困难的图论 题目链接 题意: 给出由$n$个点和$m$条边构成的无向连通图,要求选出一些边.一条边被选中当且仅当它恰好被一个简单环经过. 一个环被称为简单环,当且仅当这个环上的所有点都只在这个环中被经过了一次. 输出这些边的编号的异或和.边从$1$开始编号. $1\le n\le 10^6,\;1\le m\le min\{10^6,n\times (n+1) /2\}$. 分析: 注意:一个图可能有很多简单环,题目要求选中所有简单环上的边.考场上我就是这一点搞错了.(其实搞对了也很可能做不

纪中集训2019.11.07

A.极好的问题 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 B.背包问题 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 C.子树问题 题目链接 题意: 咕 分析: 咕 小结: 咕 当天总结: 咕 原文地址:https://www.cnblogs.com/Hansue/p/11811824.html

纪中集训2019.11.09

A.搞笑的代码 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 B.道路维护 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 C.字符串查询 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 当天总结: 咕 原文地址:https://www.cnblogs.com/Hansue/p/11826647.html

纪中集训2019.11.08

A.三角形计数 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 B.Isaac 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 C.字符消除 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 当天总结: 咕 原文地址:https://www.cnblogs.com/Hansue/p/11826709.html

木兮的纪中集训感想

嗯 第一次写博客... 就记录一下我这个OI萌新在纪中集训的感受吧 ## 学校 对于纪中,我这几天下来还是非常认可这所学校的:全国最美中学名不虚传(宿舍除外),校园环境非常好,虽然建校将近百年,但维护工作做得非常到位,看不出太多时间的痕迹. 训练 抛开学校环境不讲,这里的教学也是非常棒的,我来这里之前一直觉得集训应该是一件非常累的事,但事实并没有我想象的那么坏.先放一个训练的时间表 8:00 ~ 11:20 打模拟 14:00 ~ 17:30 讲题+自己改程序 19:00 ~ 21:50 自习