Sereja and LCM

 
Problem 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

  • 1T10
  • 1N5*106
  • 1LRM1000

Subtasks

  • Subtask #1: 1N, M10 (25 points)
  • Subtask #2: 1N, 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(矩阵快速幂)的更多相关文章

  1. CodeChef February Challenge 2018 Broken Clock (三角函数推导 + 矩阵快速幂)

    题目链接  Broken Clock   中文题面链接 令$cos(xα) = f(x)$ 根据三角函数变换公式有 $f(x) = \frac{2d}{l} f(x-1) - f(x-2)$ 我们现在 ...

  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) ...

  3. hdu 5451 Best Solver 矩阵循环群+矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x    求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...

  4. 【BZOJ1898】[ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划)

    [BZOJ1898][ZJOI2005]沼泽鳄鱼(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 先吐槽,说好了的鳄鱼呢,题面里面全是食人鱼 看到数据范围一眼想到矩乘. 先不考虑食人鱼的问题,直接 ...

  5. Luogu P4159 [SCOI2009]迷路 矩阵快速幂+精巧转化

    大致就是矩阵快速幂吧.. 这个时候会发现这些边权$\le 9$,然后瞬间想到上回一道题:是不是可以建一堆转移矩阵再建一个$lcm(1,2,3,4,5,6,7,8,9)$的矩阵?...后来发现十分的慢q ...

  6. 5950 Recursive sequence (矩阵快速幂)

    题意:递推公式 Fn = Fn-1 + 2 * Fn-2 + n*n,让求 Fn; 析:很明显的矩阵快速幂,因为这个很像Fibonacci数列,所以我们考虑是矩阵,然后我们进行推公式,因为这样我们是无 ...

  7. bzoj 1898: [Zjoi2005]Swamp 沼泽鳄鱼【dp+矩阵快速幂】

    注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 #include ...

  8. CodeChef-----February Challenge 2018---Broken Clock(极坐标+三角函数递推+矩阵快速幂)

    链接:  https://www.codechef.com/FEB18/problems/BROCLK Broken Clock Problem Code: BROCLK Chef has a clo ...

  9. E - Recursive sequence HDU - 5950 (矩阵快速幂)

    题目链接:https://vjudge.net/problem/HDU-5950 思路: 构造矩阵,然后利用矩阵快速幂. 1 #include <bits/stdc++.h> 2 #inc ...

随机推荐

  1. cp 复制文件或目录

    1. 命令功能 cp --copy files and directories.复制文件或目录. 2. 语法格式 cp  [option]  source des cp  [option]  sour ...

  2. alert(1) to win 10

  3. Spring3.x 升级至 Spring4.x 详解

    1 升级依赖包 1.1 Maven 项目 1.1.1 更新 spring 依赖版本 打开 pom.xml,把所有 spring3.x 的版本号更新为 spring4.x.建议使用属性配置,形如: &l ...

  4. Spring---数据访问

    1.Spring Data概述 1.1.Spring Data 项目 是  Spring用来解决数据访问问题   的一站式解决方案,包含了  大量关系型数据库.非关系型数据库  的  数据访问解决方案 ...

  5. Java浏览器弹出下载框,多个文件导出压缩包

    项目里一直有这个功能,也一直没怎么注意,今天研究了一下 依据逻辑往下走: 首先是要下载的ajax的Java方法,只有返回值需要设定一下,其他的不用管: Map<String, Object> ...

  6. iOS设计模式之桥接模式

    一,什么是桥接模式 定义 抽象出层次结构.上层抽象接口的职能,实现上层抽象接口的职能,层级间的通信协议(可以抽象为接口).桥接模式的目的,就是把抽象层次结构从具体的实现中分离出来,使其能够独立变更.抽 ...

  7. 【CF1257E】The Contest【线段树】

    题意:给定三个序列abc,问最少操作几次使得满足a<b<c 题解:将三个序列合并起来,设cnt[i][1/2/3]表示前i个数有几个是来自序列1/2/3的. 枚举第一个序列要到i,此时对于 ...

  8. MySQL server has gone away 问题解决方法

    问题描述: SQLyog在执行大的sql文件时候,报错,报错日志显示2006 - MySQL server has gone away 解决办法: 在php.ini配置文件的[mysqld]节点下添加 ...

  9. Oracle dmp文件(表)导入与导出

    dmp文件是作为oracle导入和导出表使用的文件格式dmp文件导出dmp文件导出用的比较多的一般是三种,他们分别是:1.导出整个数据库实例下的所有数据2.导出指定用户的所有表3.导出指定表. 打开命 ...

  10. [CSP-S模拟测试]:轰炸行动(bomb)(塔尖+拓扑排序+语文)

    题目描述 战狂也在玩<魔方王国>.他只会征兵而不会建城市,因此他决定对小奇的城市进行轰炸.小奇有n座城市,城市之间建立了$m$条有向的地下通道.战狂会发起若干轮轰炸,每轮可以轰炸任意多个城 ...