目录

  • @description@
  • @solution@
  • @accepted code@
  • @details@


@description@

定义矩阵 \(A_i\) 是一个大小为 \(p^i*p^i\) 的矩阵,其中 \(p\) 是第 \(c\) 个素数(c 给定),且 \(A_i[x][y] = [C(x, y) \mod p > 0]\)(其中 C(x, y) 是组合数)。
行列从 0 开始计数。

再定义 \(F[i][j]\) 表示 \((A_i)^j\) 中所有元素之和。

求 \(\sum_{i=1}^n\sum_{j=1}^{k}F[i][j]\)。对 10^9 + 7 取模。

Input
第一行包含一个整数 T,然后接下来是 T 组数据:
每一组数据包含三个整数 c, n, k (0 < n ≤ 10^9, 0 < c, k ≤ 10^5)。意义如上。

Output
对于每组数据,输出一个整数表示答案。

Sample Input
1
1 1 1
Sample Output
3

@solution@

看上去这个题非常不可做,先定义了一个矩阵,然后又要求矩阵幂,然后又要把这个矩阵幂中所有元素求和,然后又要把这些矩阵求和的结果再求和。
但是你只需要找到突破口,剩下的部分就一气呵成(其实一气呵成这个词不能这么用。。。今年中考考了这玩意儿,然后做错了,所以印象深刻。。。)
怎么找突破口?你只需要把题目倒过来读注意到矩阵的定义涉及到组合数对素数取模,于是就可以牵扯出 lucas 定理。

lucas 定理是什么?其实很简单。对于 \(C(n, m) \mod p\),我们将 n, m 拆成 p 进制数的形式,即 \(n = n_0 + n_1*p^1 + ..., m = m_0 + m_1*p^1 + ...\)。
于是 lucas 定理告诉我们:\(C(n, m) = C(n_0, m_0)*C(n_1, m_1)*... \mod p\)
证明这个定理也不难,只是与这道题无关所以暂且不提。

很显然 \(C(n, m) \mod p \ge 0\),所以我们只需要判断 \(C(n, m) \mod p = 0\) 是否成立即可。
又因 \(n_i < p, m_i < p\) (因为是 p 进制嘛),所以 \(C(n_i, m_i)\) 不可能含因子 p,故我们只需要对于每一个 i 判断是否 \(C(n_i, m_i) = 0\),而前面那个等价于 \(n_i > m_i\)。
所以 \(A_i[x][y]\) 为 1 等价于在 p 进制下 x 的每一位都 ≤ y 的对应位。

现在考虑 \((A_i)^j[x][y]\) 怎么求。
先试着考虑 \((A_i)^2[x][y]\),可以发现 \((A_i)^2[x][y] = \sum_{z}A_i[x][z]*A_i[z][y]\),只有当 \(A_i[x][z], A_i[z][y]\) 都为 1 时才会产生贡献。
这有点儿像偏序的关系,因为有些传递性和偏序形成链的感觉在里面。
或者用图论的语言,如果 \(A_i[x][y] = 1\) 则 x 向 y 连边。则 \((A_i)^2[x][y]\) 则有点儿像走两步(中途可以停留在原地)从 x 到达 y 的方案数。
从而简单推广,可以得到 \((A_i)^j[x][y]\) 表示走 j 步从 x 到达 y 的方案数。

那么 F[i][j] 的含义是什么?为了计数的方便我们暂且不用图论的语言描述。
F[i][j] 表示长度为 i 的 p 进制的数字串,选出 j+1 个记为 s0, s1, ... sj,对于第 x 位(1≤x≤n)始终满足 s0[x] ≤ s1[x] ≤ ... ≤ sj[x] 的方案总数。
怎么求 F[i][j] 呢?其实也比较简单。因为每一位都是独立的,所以考虑某一位然后乘法原理乘起来即可。
我们发现如果确定了 s0[x], s1[x], ..., sj[x] 分别是哪些数,它们的顺序始终是一定的(即排序过后的顺序)。所以我们相当于是求 x1 + ... + xp = j + 1 的非负整数解的个数。经典的组合数学问题,答案为 C(j+p, j+1)。
于是 F[i][j] = C(j+p, j+1)^i。

于是 \(\sum_{i=1}^n\sum_{j=1}^{k}F[i][j] = \sum_{i=1}^n\sum_{j=1}^{k}C(j+p, j+1)^i = \sum_{j=1}^{k}\sum_{i=1}^nC(j+p, j+1)^i\)。
枚举 j 然后等比数列求和即可。
注意 C(j+p, j+1) 与 C(j+p+1, j+1+1) 之间实际上是有倍数的关系(你可以把它们拆成阶乘形式以观察到这一点)。于是我们可以直接递推而不用预处理阶乘。

@accepted code@

#include<cstdio>
const int MAXM = 1299709;
const int MOD = int(1E9) + 7;
int pow_mod(int b, int p) {int ret = 1;while( p ) {if( p & 1 ) ret = 1LL*ret*b%MOD;b = 1LL*b*b%MOD;p >>= 1;}return ret;
}
int prm[MAXM + 5], pcnt;
bool nprm[MAXM + 5];
void init() {for(int i=2;i<=MAXM;i++) {if( !nprm[i] )prm[++pcnt] = i;for(int j=1;1LL*i*prm[j]<=MAXM;j++) {nprm[i*prm[j]] = true;if( i % prm[j] == 0 )break;}}
}
int solve(int p, int n, int k) {int ans = 0, tmp = p;for(int j=1;j<=k;j++) {tmp = 1LL*tmp*(j + p)%MOD*pow_mod(j + 1, MOD - 2)%MOD;if( tmp == 1 )ans = (ans + n)%MOD;else ans = (ans + 1LL*(pow_mod(tmp, n + 1) - 1)*pow_mod(tmp - 1, MOD-2)%MOD - 1)%MOD;}return (ans + MOD)%MOD;
}
int main() {init();int T; scanf("%d", &T);for(int i=1;i<=T;i++) {int c, n, k; scanf("%d%d%d", &c, &n, &k);printf("%d\n", solve(prm[c], n, k));}
}

@details@

似乎总喜欢废话很多。。。明明一个不是很复杂的题目却写了这么多东西。。。

这道题有一个点就是:等比数列要特判公比为 1 的情况。
。。。虽然数学上经常考这个东西,不过还是没记住。。。

转载于:https://www.cnblogs.com/Tiw-Air-OAO/p/11147167.html

@hdu - 6372@ sacul相关推荐

  1. HDU 4389 - X mod f(x)

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4389 2012多校,第9场,1010 . 问题是,询问区间内 存在多少个 哈沙德数(Harshad ...

  2. hdu 4389 囧,打表

    http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 :一个数能被他各个位数之和整除则符合要求,给L,R,问区间里有多少个数符合要求. 囧,居然打表就能过 ...

  3. HDU——1106排序(istringstream的使用、STLvector练习)

    排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  4. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  5. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  6. hdu 1312 Red and Black 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...

  7. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  8. hdu 1272 小希的迷宫

    Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...

  9. HDOJ 1157 HDU 1157 Who's in the Middle ACM 1157 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋   题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1157 题目描述: ...

最新文章

  1. 《滚动数组》---滚动数组思想,运用在动态规划当中
  2. 如何配note,打补丁
  3. SQL 2005清除事务日志
  4. xml对象映射_将对象映射到多个XML模式–天气示例
  5. c语言设计通讯录管理程序,C语言程序的设计学生通讯录管理系统方案.docx
  6. 绕过图片防盗链的方法
  7. 单例模式代码_设计模式之单例:程序员必知必会,举例子+代码示例,通俗易懂...
  8. 关于外部测试字段解释冲突
  9. Noi2016 循环之美
  10. yeoman、bower、grunt 开发收集
  11. Atitit 软件与互联网理论 attilax总结
  12. 【PAT】A1150 Travelling Salesman Problem【中国邮递员问题】
  13. linux服务器密码策略设置:登录密码错误次数限制
  14. Hello World, Hello, 2021
  15. 安卓中COLOR的值分析
  16. 17 -> 详解 openWRT 的 gpio 配置关系说明
  17. 采用蒙特卡罗方法生成zipf分布随机数据
  18. colorkey唇釉是否安全_colorkey唇釉真假辨别_colourkey唇釉真伪
  19. 模拟电路--一种电荷放大器的设计
  20. 【内部技术分享PPT】漫谈 RabbitMQ 消息可靠性

热门文章

  1. LeetCode—37. 解数独(困难)
  2. 全国计算机等级考试题库二级C操作题100套(第57套)
  3. kk 服务器信息,手机kk服务器设置
  4. php yii 控件分页,Yii2分页的使用及其扩展方法详解
  5. java 类调用情况_java 如何调用类?情况如下
  6. c程序语言设计练习题,C语言程序设计练习题(含程序及参考答案)
  7. php标签调用,phpcms栏目标签调用代码大全
  8. 程序人生:程序员成熟的标志
  9. 推荐VSCode12个比较实用的插件
  10. C#开发模式——单例模式