CodeChef Sereja and LCM(矩阵快速幂)
Sereja and LCMProblem code: SEALCM
|
All submissions for this problem are available.
Read problems statements in Mandarin Chinese and Russian.
In this problem Sereja is interested in number of arrays A[1], A[2], ..., A[N] (1 ≤ A[i] ≤ M, A[i] - integer)
such that least common multiple (LCM) of all its elements is divisible by number D.
Please, find sum of answers to the problem with D = L, D = L+1, ..., D = R. As answer could be large, please output it modulo
(109 + 7).
Input
- First line of input contain integer T - number of test cases.
- For each test case, only line of input contain four integers N, M, L, R.
Output
For each test case, output required sum modulo (109 + 7).
Constraints
- 1 ≤ T ≤ 10
- 1 ≤ N ≤ 5*106
- 1 ≤ L ≤ R ≤ M ≤ 1000
Subtasks
- Subtask #1: 1 ≤ N, M ≤ 10 (25 points)
- Subtask #2: 1 ≤ N, M ≤ 1000 (25 points)
- Subtask #3: original constraints (50 points)
Example
Input:
2
5 5 1 5
5 5 4 5 Output:
12310
4202
给出 N , M , L , R 。
求 用 1~M ,组成N个数 ,它们的LCM能够整除d的序列个数 , d = L ~ R 。
枚举d , 将d分解 ,d = p1^k1*p2^k2*....*pn^kn .
当一个数与d有相同质因子 pi 且 它的ki 大于等于 d的ki时 ,就能够使得LCM起到作用。
M只有1000 , 直接用二进制表示个个质因子的指数项是否大于等于d 的 ki 。
然后弄好转移矩阵 , 直接快速幂就OK了 。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1e9+;
const int N = ;
int fac[] , tot , all ; struct Matrix {
LL v[][] ;
Matrix(){ memset( v,,sizeof v); }
Matrix operator * ( const Matrix &a ) const {
Matrix res ;
for( int i = ; i < all ; ++i )
for( int k = ; k < all ; ++k ) {
if( v[i][k] == ) continue ;
for( int j = ; j < all ; ++j ) {
res.v[i][j] = ( res.v[i][j] + v[i][k] * a.v[k][j] % mod )% mod;
}
}
return res;
}
}; Matrix q_pow( Matrix a , int b ) {
Matrix res = a ;
b--;
while( b ) {
if( b& ) res = res * a ;
a = a * a ;
b >>= ;
}
return res ;
} void Work( int d ) {
tot = ;
for( int i = ; i * i <= d ; ++i ) {
if( d % i == ) {
fac[tot++] = ;
while( d % i == ) fac[tot-] *= i , d /= i ;
}
}
if( d > ) fac[tot++] = d ;
} int main() {
// freopen("in.txt","r",stdin);
int _ ; cin >> _ ;
while( _-- ) {
int n , m , l , r ;
LL ans = ;
cin >> n >> m >> l >> r ;
for( int d = l ; d <= r ; ++d ) {
Work(d); Matrix a ;
all = <<tot ;
for( int i = ; i < all ; ++i ) {
for( int j = ; j <= m ; ++j ) {
int st = i ;
for( int k = ; k < tot ; ++k ) {
if( j % fac[k] == ) st |= (<<k) ;
}
a.v[i][st]++;
}
}
a = q_pow(a,n);
ans = ( ans + a.v[][all-] ) % mod ;
}
cout << ans << endl ;
}
}
CodeChef Sereja and LCM(矩阵快速幂)的更多相关文章
- CodeChef February Challenge 2018 Broken Clock (三角函数推导 + 矩阵快速幂)
题目链接 Broken Clock 中文题面链接 令$cos(xα) = f(x)$ 根据三角函数变换公式有 $f(x) = \frac{2d}{l} f(x-1) - f(x-2)$ 我们现在 ...
- Codechef Eugene and big number(矩阵快速幂)
题目链接 Eugene and big number 题目转化为 $f(n) = m * f(n - 1) + a$ $f(n + 1) = m * f(n) + a$ 两式相减得 $f(n + 1) ...
- hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x 求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...
- 【BZOJ1898】[ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划)
[BZOJ1898][ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 先吐槽,说好了的鳄鱼呢,题面里面全是食人鱼 看到数据范围一眼想到矩乘. 先不考虑食人鱼的问题,直接 ...
- Luogu P4159 [SCOI2009]迷路 矩阵快速幂+精巧转化
大致就是矩阵快速幂吧.. 这个时候会发现这些边权$\le 9$,然后瞬间想到上回一道题:是不是可以建一堆转移矩阵再建一个$lcm(1,2,3,4,5,6,7,8,9)$的矩阵?...后来发现十分的慢q ...
- 5950 Recursive sequence (矩阵快速幂)
题意:递推公式 Fn = Fn-1 + 2 * Fn-2 + n*n,让求 Fn; 析:很明显的矩阵快速幂,因为这个很像Fibonacci数列,所以我们考虑是矩阵,然后我们进行推公式,因为这样我们是无 ...
- bzoj 1898: [Zjoi2005]Swamp 沼泽鳄鱼【dp+矩阵快速幂】
注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 #include ...
- CodeChef-----February Challenge 2018---Broken Clock(极坐标+三角函数递推+矩阵快速幂)
链接: https://www.codechef.com/FEB18/problems/BROCLK Broken Clock Problem Code: BROCLK Chef has a clo ...
- E - Recursive sequence HDU - 5950 (矩阵快速幂)
题目链接:https://vjudge.net/problem/HDU-5950 思路: 构造矩阵,然后利用矩阵快速幂. 1 #include <bits/stdc++.h> 2 #inc ...
随机推荐
- centos误删除文件如何恢复
当意识到误删除文件后,切忌千万不要再频繁写入了,否则你的数据恢复的数量将会很少. 而我们要做的是,第一时间把服务器上的服务全部停掉,直接killall 进程名 或者 kill -9 pid . 然后把 ...
- 线程池-连接池-JDBC实例-JDBC连接池技术
线程池和连接池 线程池的原理: 来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客 ...
- tf.cast()用法
把布尔类型转化成0和1类型,true是1,false是0反之,亦成立.
- amqp 抓包 不要在同一台机器
- uboot学习之五-----uboot如何启动Linux内核
uboot和内核到底是什么?uboot实质就是一个复杂的裸机程序:uboot可以被配置也可以做移植: 操作系统内核本身就是一个裸机程序,和我们学的uboot和其他裸机程序没有本质的区别:区别就是我们操 ...
- 转 Java中wait和sleep方法的区别
1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...
- mysql错误: waiting for table metadata lock
今天突然发现truncate一个表都慢到不行,于是 SHOW PROCESSLIST 发现错误:waiting for table metadata lock解决方法:查看information_sc ...
- 给数据库用户授权(对象多为系统表,如dba可以查看的表)
我们知道,创建一个新用户时,网上各种的帖子包括书籍中经常用到一个grant connect,resource to user;,这样才能用这个用户登录数据库,那么这条语句的真正作用是什么呢? 首先,g ...
- 前端每日实战:2# 视频演示如何用纯 CSS 创作一个矩形旋转 loader 特效
效果预览 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/vjLQMM 可交互视频教程 此视频是可以交 ...
- PHP实现多服务器SESSION共享
为什么要session共享? 现在稍微大一点的网站基本上都有好几个子域名,比如www.feiniu.com, search.feiniu.com, member.feiniu.com,这些网站如果需要 ...