\(\mathcal{Description}\)

  Link.

  \(T\) 组询问,每次给出 \(n,a,b,c,k_1,k_2\),求

\[\sum_{x=0}^nx^{k_1}\left\lfloor\frac{ax+b}{c}\right\rfloor^{k_2}\bmod(10^9+7)
\]

  \(T=1000\),\(n,a,b,c\le10^9\),\(0\le k_1+k_2\le 10\)。

\(\mathcal{Solution}\)

  类欧模板题的集大成者。

  令 \(f(n,a,b,c,k_1,k_2)\) 表示所求答案,尝试通过分类讨论递归到不同的情况求解。

  1. \(a=0\lor an+b<c\)

    \[f(n,a,b,c,k_1,k_2)=\left\lfloor\frac{an+b}{c}\right\rfloor^{k_2}\sum_{x=0}^nx^{k_1}
    \]

    预处理 \(k+1\) 次多项式 \(g_k(x)=\sum_{i=0}^xi^k\) 的各项系数,这个就能直接算出来。

  2. 否则若 \(a\ge c\)

    \[\begin{aligned}
    f(n,a,b,c,k_1,k_2)&=\sum_{x=0}^nx^{k_1} \left(\left\lfloor\frac{a}{c}\right\rfloor x+\left\lfloor\frac{(a\bmod c)x+b}{c}\right\rfloor \right)^{k_2}\\
    &=\sum_{i=0}^{k_2} \binom{k_2}{i} \left\lfloor\frac{a}{c}\right\rfloor^i\sum_{x=0}^n x^{k_1+i}\left\lfloor\frac{(a\bmod c)x+b}{c}\right\rfloor^{k_2-i}\\
    &=\sum_{i=0}^{k_2} \binom{k_2}{i} \left\lfloor\frac{a}{c}\right\rfloor^i f(n,a\bmod c,b,c,k_1+i,k_2-i)
    \end{aligned}
    \]

    递归处理。

  3. 否则若 \(b\ge c\)

    类似 2.,最终得到

    \[f(n,a,b,c,k_1,k_2)=\sum_{i=0}^{k_2} \binom{k_2}{i} \left\lfloor\frac{b}{c}\right\rfloor^i f(n,a,b\bmod c,c,k_1,k_2-i)
    \]

    递归处理。

  4. 对于其余情况

    考虑把高斯函数丢到求和指标上,注意到

    \[m^k=\sum_{j=0}^{m-1}[(j+1)^k-j^k]
    \]

    以此替代 \(\left\lfloor\frac{ax+b}{c}\right\rfloor^{k_2}\),并交换求和顺序,得到

    \[\begin{aligned}
    f(n,a,b,c,k_1,k_2)&=\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}[(j+1)^{k_2}-j^{k_2}]\sum_{x=0}^nx^{k_1}\left[x>\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor \right]\\
    &= \sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1} [(j+1)^{k_2}-j^{k_2}]\sum_{x=0}^n x^{k_1}-\sum_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1} [(j+1)^{k_2}-j^{k_2}]\sum_{x=0}^{\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor} x^{k_1}
    \end{aligned}
    \]

    前半部分直接计算,研究后半部分,发现最后一个求和符号是 \(g_{k_1}\left(\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)\),枚举次数将其展开:

    \[\begin{aligned}
    &=\sum_{i=0}^{k_2-1}\binom{k_2}{i} \sum_{j=0}^{k_1+1}([x^j]g_{k_1})\sum_{x=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}x^i\left\lfloor\frac{cx+c-b-1}{a}\right\rfloor^j\\
    &=\sum_{i=0}^{k_2-1}\binom{k_2}{i} \sum_{j=0}^{k_1+1}([x^j]g_{k_1})f\left(\left\lfloor\frac{an+b}{c}\right\rfloor-1,c,c-b-1,a,i,j\right)
    \end{aligned}
    \]

    其中 \(i\) 枚举 \((j+1)^{k_2}\) 的次数;\(j\) 枚举 \(g_{k_1}\) 的次数;\(x\) 枚举原来的 \(j\)。这样也能递归求解了。

  递归中指标变换形如欧几里得算法,设指标值域为 \(V\),\(K=k_1+k_2\),则复杂度为 \(\mathcal O(TK^4\log V)\)。

\(\mathcal{Code}\)

  实现时,可以对于 \(n,a,b,c\),一次算出所有可能的 \(f(n,a,b,c,k_1,k_2)\) 的值。

  1. /*~Rainybunny~*/
  2. #include <cstdio>
  3. #include <cassert>
  4. #include <iostream>
  5. #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
  6. #define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
  7. typedef long long LL;
  8. const int MOD = 1e9 + 7;
  9. int comb[15][15];
  10. inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += MOD ); }
  11. inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
  12. inline int mul( const long long a, const int b ) { return int( a * b % MOD ); }
  13. inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
  14. inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
  15. inline int mpow( int a, int b ) {
  16. int ret = 1;
  17. for ( ; b; a = mul( a, a ), b >>= 1 ) ret = mul( ret, b & 1 ? a : 1 );
  18. return ret;
  19. }
  20. struct PowerPoly {
  21. int n, a[12];
  22. PowerPoly() {}
  23. PowerPoly( const int k ): n( k ) {
  24. static int mat[15][15];
  25. for ( int i = 0, p = 0; i <= n + 1; ++i ) {
  26. addeq( p, mpow( i, n ) );
  27. mat[i][n + 2] = p;
  28. }
  29. rep ( i, 0, n + 1 ) {
  30. for ( int j = 0, p = 1; j <= n + 1; ++j, p = mul( p, i ) ) {
  31. mat[i][j] = p;
  32. }
  33. }
  34. rep ( i, 0, n + 1 ) {
  35. int p = -1;
  36. rep ( j, i, n + 1 ) if ( mat[j][i] ) { p = j; break; }
  37. assert( ~p );
  38. if ( p != i ) std::swap( mat[i], mat[p] );
  39. int iv = mpow( mat[i][i], MOD - 2 );
  40. rep ( j, i + 1, n + 1 ) {
  41. int t = mul( iv, mat[j][i] );
  42. rep ( l, i, n + 2 ) subeq( mat[j][l], mul( mat[i][l], t ) );
  43. }
  44. }
  45. per ( i, n + 1, 0 ) {
  46. a[i] = mul( mat[i][n + 2], mpow( mat[i][i], MOD - 2 ) );
  47. rep ( j, 0, i - 1 ) subeq( mat[j][n + 2], mul( a[i], mat[j][i] ) );
  48. }
  49. }
  50. inline int operator () ( LL x ) const {
  51. int ret = 0; x %= MOD;
  52. for ( int i = 0, p = 1; i <= n + 1; ++i, p = mul( x, p ) ) {
  53. addeq( ret, mul( a[i], p ) );
  54. }
  55. return ret;
  56. }
  57. };
  58. const PowerPoly pwr[11]
  59. = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  60. struct Atom {
  61. int res[11][11];
  62. Atom(): res{} {}
  63. inline int* operator [] ( const int k ) { return res[k]; }
  64. };
  65. /* *
  66. * calculate \sum_{x=0}^n x^{k_1} \lfloor \frac{ax+b}{c} \rfloor^{k_2},
  67. * where k_1+k_2 <= 10.
  68. * */
  69. inline Atom solve( const LL n, const LL a, const LL b, const LL c ) {
  70. Atom ret; LL m = ( a * n + b ) / c;
  71. if ( !a || 1ll * a * n + b < c ) {
  72. rep ( k1, 0, 10 ) {
  73. int t = int( m % MOD ), p = 1;
  74. rep ( k2, 0, 10 - k1 ) {
  75. ret[k1][k2] = mul( p, pwr[k1]( n ) );
  76. p = mul( p, t );
  77. }
  78. }
  79. return ret;
  80. }
  81. if ( a >= c ) {
  82. Atom tmp( solve( n, a % c, b, c ) );
  83. rep ( k1, 0, 10 ) rep ( k2, 0, 10 - k1 ) {
  84. int t = int( ( a / c ) % MOD ), p = 1;
  85. rep ( i, 0, k2 ) {
  86. addeq( ret[k1][k2], mul( comb[k2][i],
  87. mul( p, tmp[k1 + i][k2 - i] ) ) );
  88. p = mul( p, t );
  89. }
  90. }
  91. return ret;
  92. }
  93. if ( b >= c ) {
  94. Atom tmp( solve( n, a, b % c, c ) );
  95. rep ( k1, 0, 10 ) rep ( k2, 0, 10 ) {
  96. int t = int( ( b / c ) % MOD ), p = 1;
  97. rep ( i, 0, k2 ) {
  98. addeq( ret[k1][k2], mul( comb[k2][i],
  99. mul( p, tmp[k1][k2 - i] ) ) );
  100. p = mul( p, t );
  101. }
  102. }
  103. return ret;
  104. }
  105. Atom tmp( solve( m - 1, c, c - b - 1, a ) );
  106. rep ( k1, 0, 10 ) {
  107. int t = int( m % MOD ), p = 1;
  108. rep ( k2, 0, 10 - k1 ) {
  109. ret[k1][k2] = mul( p, pwr[k1]( n ) );
  110. rep ( i, 0, k2 - 1 ) rep ( j, 0, k1 + 1 ) {
  111. subeq( ret[k1][k2], mul( comb[k2][i],
  112. mul( pwr[k1].a[j], tmp[i][j] ) ) );
  113. }
  114. p = mul( t, p );
  115. }
  116. }
  117. return ret;
  118. }
  119. int main() {
  120. comb[0][0] = 1;
  121. rep ( i, 1, 10 ) {
  122. comb[i][0] = 1;
  123. rep ( j, 1, i ) comb[i][j] = add( comb[i - 1][j - 1], comb[i - 1][j] );
  124. }
  125. int n, a, b, c, k1, k2, T;
  126. for ( scanf( "%d", &T ); T--; ) {
  127. scanf( "%d %d %d %d %d %d", &n, &a, &b, &c, &k1, &k2 );
  128. printf( "%d\n", solve( n, a, b, c )[k1][k2] );
  129. }
  130. return 0;
  131. }

Solution -「LOJ #138」「模板」类欧几里得算法的更多相关文章

  1. Luogu 5170 【模板】类欧几里得算法

    原理不难但是写起来非常复杂的东西. 我觉得讲得非常好懂的博客.   传送门 我们设 $$f(a, b, c, n) = \sum_{i = 0}^{n}\left \lfloor \frac{ai + ...

  2. 洛谷P5170 【模板】类欧几里得算法(数论)

    传送门 此题剧毒,公式恐惧症患者请直接转去代码→_→ 前置芝士 基本数论芝士 题解 本题就是要我们求三个函数的值 \[f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac ...

  3. 「LOJ 556 Antileaf's Round」咱们去烧菜吧

    「LOJ 556 Antileaf's Round」咱们去烧菜吧 最近在看 jcvb 的生成函数课件,顺便切一切上面讲到的内容的板子题,这个题和课件上举例的背包计数基本一样. 解题思路 首先列出答案的 ...

  4. Solution -「Luogu 5170」类欧几里得算法

    推柿子大赛了属于是. 题目要求三个柿子,不妨分别记为: \[\begin {align} f (a, b, c, n) &= \sum \limits _{i = 0} ^{n} \lfloo ...

  5. Note -「多项式」基础模板(FFT/NTT/多模 NTT)光速入门

      进阶篇戳这里. 目录 何为「多项式」 基本概念 系数表示法 & 点值表示法 傅里叶(Fourier)变换 概述 前置知识 - 复数 单位根 快速傅里叶正变换(FFT) 快速傅里叶逆变换(I ...

  6. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  7. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  8. [LOJ 6030]「雅礼集训 2017 Day1」矩阵

    [LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...

  9. [LOJ 6029]「雅礼集训 2017 Day1」市场

    [LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...

随机推荐

  1. java.exe and -classpth or -cp

    mydirname=$(dirname $0) java -cp $classes_dir:$lib_dir/*:$config_dir -Doracle.net.wallet_location=${ ...

  2. vuex获取数据

    cmd窗口vue add vuex后出现store文件夹,在里面的index.js里面设置state属性,可以在视图页面home.vue文件中获取. 方法1: //在项目当中引入router以后 就多 ...

  3. Nginx虚拟主机、日志排错、模块配置

    目录 Nginx虚拟主机 1. 基于多IP的方式 2. 基于多端口的方式 3. 基于多域名的方式 Nginx日志 Nginx配置文件配置项 Nginx模块 Nginx访问控制模块 Nginx状态监控模 ...

  4. ffmpeg+nginx截取屏幕实时画面并进行rtmp推流在前端播放

    准备环境和文件 1.下载ffmpeg的包[https://foxbaby.lanzoui.com/iYjPmup51cd] 地址:https://ffmpeg.org/download.html#bu ...

  5. leetcode刷题目录

    leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ...

  6. C# 文件对话框例子

    OpenFileDialog控件的基本属性InitialDirectory:对话框的初始目录 Filter: 获取或设置当前文件名筛选器字符串,例如,"文本文件(*.txt)|*.txt|所 ...

  7. java string 转化为json_java String 转Json报错

    缺少jar包依赖: java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean 缺少commons-beanutils- ...

  8. 新手学习Java,如何快速从入门到精通!

    首先我要给你说的是,任何一个东西从零到精通,都是需要一个过程的,就相当于我们在小学的时候学乘法口诀表,背文言文一样,都是需要我们慢慢的去渡过这个阶段,我们才能慢慢的掌握,其次,毕竟这是一门编程语言,你 ...

  9. 使用EdgyGeo Cesium工具查询下载数据集

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ EdgyGeo, Inc. 带来了一件非常棒的工作支撑架构.工程 ...

  10. QT控件之QSlider

    singleStep:比如按下键盘的左右建,每次移动的距离 pageStep:比如用鼠标对准滑动条的前面按下,每次移动的距离 value:初始默认值 接下来看该控件拥有的信号: 重点看后面的四个,看字 ...