@hdu - 6372@ sacul

目录

  • @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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验室里人越来越少啊!

研二下半学期了。研三的师哥师姐们都忙着找工作&#xff0c;有的已经去工作了。只是偶而来实验室转转。研一的师弟师妹&#xff0c;现在还都有课&#xff0c;实验室也没他们的机器&#xff0c;所以几乎不来实验室。我们研二的有四个人&#xff0c;两个北京的。其中一个在外面打…

在一台机器上搭建多个redis实例

默认Redis程序安装在/usr/local/redis目录下&#xff1b; 配置文件&#xff1a;/usr/local/redis/redis.conf&#xff0c;该配置文件中配置的端口为默认端口&#xff1a;6379&#xff1b; Redis的启动命令路径&#xff1a;/usr/local/bin/redis-server。 可以指定端口启动多个R…

2年前 影子

1. 请问您知道 xxxx吗 ? 麻烦了您? 2. 您在公司待了多长时间了&#xff1f; 3. 您觉得公司怎么样&#xff1f; 。。。。。。 待续&#xff01; 转载于:https://www.cnblogs.com/nucdy/p/11151470.html

linux是只读添加 来覆盖,Linux之指令 重定向 文件覆盖和文件追加

CXF支持 SOAP1&period;1 SOAP1&period;2协议SOAP协议分为两个版本 1.1 1.2 默认支持1.1 实现方式: 1.编写接口 import javax.jws.WebService; WebService public inte ...USACO Section 2&period;4&colon; Bessie Come Home因为题目给了边的信息,所以比较…

分层架构web容器的配置安全

转自&#xff1a;http://hi.baidu.com/shineo__o/item/7520d54c24d234c71081da82 /ps:本以为这是一个偶然配置失误造成的问题&#xff0c;但最近几天无聊时测试发现&#xff0c;有此类似问题的站点就有上百个&#xff0c;所以在这里粗糙总结一下&#xff01; 通常我们会碰到这样…

Jenkins-Gitlab配置方法

1&#xff09;本机首先安装好git软件2&#xff09;然后安装gitlab插件,在可选插件中查找gitlab,点击直接安装3&#xff09;然后进入系统管理-系统设置 首先进入Gitlab中复制需要的 token 值在 Profile Settings - Account把复制的值&#xff0c;复制到新增页面中转载于:https:…

高速缓冲存储器的功能、结构与工作原理

2.3 高速缓冲存储器&#xff08;Cache&#xff09; 2.3.1 高速缓冲存储器的功能、结构与工作原理   高速缓冲存储器是存在于主存与CPU之间的一级存储器&#xff0c; 由静态存储芯片(SRAM)组成&#xff0c;容量比较小但速度比主存高得多&#xff0c; 接近于CPU的速度。 Cache…

洛谷 P1417 烹调方案 (01背包拓展)

一看到这道题就是01背包 但是我注意到价值和当前的时间有关。 没有想太多&#xff0c;直接写&#xff0c;0分 然后发现输入方式不对…… 改了之后只有25分 我知道wa是因为时间会影响价值&#xff0c;但不知道怎么做。 后来看了题解&#xff0c;发现我对01背包理解不够透彻普通0…

LeetCode 77.组合求和

给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 target&#xff09;都是正整数。解集不能包含重复的组合…

18函数对象19command模式20函数对象在STL中的应用

Item 18. Function ObjectsItem 19. Commands and HollywoodItem 20. STL Function Objects1、unction Objects是什么函数对象听起来挺吓人&#xff0c;其实并不神秘&#xff0c;它也是一个类的对象&#xff0c;只不过该类重载了操作符(),使得对象使用以来跟函数一样。class Fi…

linux df命令功能,Linux df命令简要介绍

日常工作生活中&#xff0c;我们常需要查看系统当前的磁盘空间使用情况。在windows下&#xff0c;只需简单点击我的电脑&#xff0c;就看到带进度条的系统磁盘使用情况&#xff0c;非常直观。那linux命令行下如何实现同样的功能呢&#xff1f;这就是我们今天要介绍的df命令。df…

spring集成RabbitMQ配置文件详解(生产者和消费者)

1&#xff0c;首先引入配置文件org.springframework.amqp&#xff0c;如下&#xff1a; <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId><version>1.7.1.RELEASE</version></de…

一天的学习成果:hash输出,dcache工作原理,include的home directory,fist optype的含义...

最先获得突破的是解决了下午的崩溃问题。其实原因很简单&#xff0c;我声明了一个unsigned int型指针&#xff0c;但是没有给它分配空间…… 解决了这个问题之后就很简单了&#xff0c;调用定义在linux/dcache.c文件中的full_name_hash函数对文件名进行hash计算。这里发现了一个…

linux显示fio为非法指令,FORTRAN运行错误消息列表中英对照.doc

FORTRAN运行错误消息列表中英对照Fortran的运行时错误消息列表本节列出了英特尔Fortran运行时库(RTL)处理的错误。对于每一个错误&#xff0c;该表提供了错误号&#xff0c;严重性代码&#xff0c;错误信息文本&#xff0c;条件符号名称&#xff0c;而错误的详细说明。在程序中…

各种证书

软考高级信息系统项目管理师https://www.zhihu.com/question/29904891 转载于:https://www.cnblogs.com/trumbull/p/11154514.html

linux面试题中的简答题,[计算机]linux面试题简答题部分.doc

[计算机]linux面试题简答题部分linux面试题(简答题部分)2 简述进程的启动、终止的方式以及如何查看进程&#xff1f;答&#xff1a;启动进程的方式分为手动启动和自动启动两种方式,其中手动启动的方法用services 服务名 start;或者是./脚本名称,自动启动进程的方法有将进程服务…

const用法

const的用法很让人荤菜&#xff0c;现在总结以下&#xff1a;1&#xff0c;必须初始化2&#xff0c;作为函数的参数是个好习惯&#xff0c;const在*号左边所指常量值&#xff0c;在右边所指的是常量指针3&#xff0c;const成员函数的目的是指明该函数可以在const对象上调用,也就…

Multiverse: Revolutionary Backend for Alembic // Multiverse: 下一代Alembic后端

J CUBE&#xff0c;日本最大的动画公司Polygon Picture&#xff08;以下简称PPI&#xff09;公司成立的专职R&D公司隆重推出Multiverse&#xff0c;下一代Alembic存储后端。 我们还开发了针对Autodesk Maya的工具&#xff0c;运用Multiverse在流程中。 "multiverse&qu…

c语言 程序延时 校准,c语言实现系统时间校正工具代码分享

//*******************************************************************//Time Protocol是一种非常简单的应用层协议。它返回一个未格式化的32位二进制数字,//这个数字描述了从1900年1月1日午夜到现在的秒数。服务器在端口37监听协议请求&#xff0c;以//TCP/IP或者UDP/IP格式…

近半年能力没进步原因分析与求助

2019独角兽企业重金招聘Python工程师标准>>> 20180907 思维方式有缺陷&#xff0c;想到的解决方法经常不是最有效率的。导致工作时间内基本没自由学习的时间。 业余时间不够专注&#xff0c;学习方向经常变&#xff0c;没能坚持搞透一个点就换书看&#xff0c;没有总…