首页 > 其他分享 >[SDOI2017]数字表格

[SDOI2017]数字表格

时间:2023-06-02 12:44:49浏览次数:42  
标签:lfloor frac 数字 表格 int rfloor mu SDOI2017 mod

题意

求如下表达式的值

\[\prod_{i=1}^{n} \prod_{j=1}^{m} f_{gcd(i,j)} \pmod{10^9 + 7} \]

其中,\(f_i\)为 fibonacci 数列的第\(i\)项,\(n, m \leqslant 10^6\)

Solution

\[\prod_{i=1}^{n} \prod_{j=1}^{m} f_{gcd(i,j)} \]

改变枚举顺序,优先枚举\(d = gcd(i,j)\),

\[=\prod_{d=1}^{min\{n, m\}} f_d ^ {\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j)=1]} \]

取出指数,记:

\[g(d) = \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j)=1] \]

\[=\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} \sum_{x|gcd(i,j)} \mu(x) \]

莫比乌斯反演经典处理手段,优先枚举因子,

\[= \sum_{x=1}^{min\{\lfloor \frac{n}{d} \rfloor , \lfloor \frac{m}{d} \rfloor \}} \mu(d) \lfloor \frac{n}{xd} \rfloor \lfloor \frac{m}{xd} \rfloor \]

带回原表达式,则有,

\[\prod_{d=1}^{min\{n, m\}} \ \prod_{x=1}^{min\{\lfloor \frac{n}{d} \rfloor, \lfloor \frac{m}{d}\ \rfloor\}}f_d^{\mu(x) \lfloor \frac{n}{x\ d} \rfloor \lfloor \frac{m}{x\ d} \rfloor} \]

可以比较容易发现,该式子可以通过两次数论分块解决,时间复杂度为\(O(T \ n \log n)\),还需要继续优化

考虑将此式子转化为更加便于预处理\(\mu(x)\)的表达式,则记\(T = xd\),

\[= \prod_{T=1}^{min\{n, m\}} \ \prod_{d|T} f_d^{\mu(\lfloor \frac{T}{d} \rfloor) \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor} \]

改变一下幂指数的顺序,

\[= \prod_{T=1}^{min\{n, m\}} \left( \prod_{d|T} f_d^{\mu(\lfloor \frac{T}{d} \rfloor)} \right)^{\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor} \]

外面是我们熟悉的数论分块的形式,里面考虑到\(\mu(\lfloor \frac{T}{d} \rfloor)\)的取值只能为\(-1, 1, 0\),可以\(O(n \log {n})\)筛出\(\mu\)的值并且计算,然后在\(O(n \sqrt{n})\)的时间内完成。

\(O(n \sqrt{n})\)?感觉在\(10^6\)下不能容纳这个时间复杂度,但是考虑到\(\mu(i) \ne 0\)的个数只有\(607926\)个,时间复杂度应该重新表达为\(O(n + 607926\sqrt{n})\)。

费马小定理与欧拉定理

费马小定理

若\(p\)为质数,\(gcd(a,p)=1\),则\(a^{p-1} \equiv 1 \pmod{p}\)

欧拉定理

若\(gcd(a,m)=1\)则\(a^{\varphi(m)} \equiv 1 \pmod{m}\)

拓展欧拉定理

\[a^b \equiv \begin{cases} a^{b \bmod \varphi(m)}, & \text {$gcd(a,m)=1,$} \\ a^b, &\text {$gcd(a,m) \ne 1, b < \varphi(m),$} \\ a^{(b \bmod \varphi(m)) + \varphi(m)} , &\text {$gcd(a,m) \ne 1, b \geqslant \varphi(m).$} \end{cases} \pmod{m}\]

以上证明略。

因为本题要求对幂指数取模求解,并且本题的模数$m = 10^9 + 7 $,可以通过拓展欧拉定理加以求解。

Code

点击查看代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 1e6 + 50;
const int mod = 1e9 + 7;

inline int read() {
	int res = 0, f = 1;
	char c = getchar();
	while (c > '9' || c < '0') {
		if (c == '-')  f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		res = (res << 3) + (res << 1) + c - '0';
		c = getchar();
	}	
	return res * f;
}

inline int add_mod(int a, int b) {
	a += b;
	if (a < 0)  a += mod;
	if (a >= mod)  a -= mod;
	return a;
}
inline int del_mod(int a, int b) {
	a -= b;
	if (a < 0)  a += mod;
	if (a >= mod)  a -= mod;
	return a;
}
inline int mul_mod(int a, int b) {
	a = 1ll * a * b % mod;
	return a;
}

int num;
int prime[N], mu[N];
int v[N];

int f[N], F[N], inv[N];

inline int qpow(int a, int b) {
	int base = 1;
	while (b) {
		if (b & 1)  base = mul_mod(base, a);
		a = mul_mod(a, a);
		b >>= 1;
	}
	return base;
}

void init() {
	int MAX = 1e6;
	F[0] = F[1] = f[1] = 1;
	inv[0] = inv[1] = 1;
	mu[1] = 1;
	for (int i = 2; i <= MAX; ++i) {
		f[i] = add_mod(f[i - 1], f[i - 2]);
		inv[i] = qpow(f[i], mod - 2);
		F[i] = 1;
		if (!v[i]) {
			prime[++num] = i;
			v[i] = i;
			mu[i] = -1;
		}
		for (int j = 1; j <= num; ++j) {
			if (prime[j] > v[i] || prime[j] > MAX / i)  break;
			v[i * prime[j]] = prime[j];
			if (i % prime[j] == 0) {
				mu[i * prime[j]] = 0;
				break;
			}
			mu[i * prime[j]] = -mu[i];
		}
	}
	for (int i = 1; i <= MAX; ++i) {
		if (!mu[i])   continue;
		for (int j = i; j <= MAX; j += i) {
			F[j] = mul_mod(F[j], (mu[i] == 1 ? f[j / i] : inv[j / i]));
		}
	}
	for (int i = 2; i <= MAX; ++i)   F[i] = mul_mod(F[i], F[i - 1]);
}

int n, m;
int ans;

int main () {
	init();
	int T = read();
	while (T--) {
		ans = 1;
		n = read(), m = read();
		for (int i = 1, j; i <= min(n, m); i = j + 1) {
			j = min(n / (n / i), m / (m / i));
			int tmp = mul_mod(F[j], qpow(F[i - 1], mod - 2));
			ans = mul_mod(ans, qpow(tmp, 1ll * (n / i) * (m / i) % (mod - 1)));
		}
		printf("%d\n", ans);
	}
    return 0;
}

标签:lfloor,frac,数字,表格,int,rfloor,mu,SDOI2017,mod
From: https://www.cnblogs.com/abigjiong/p/17451157.html

相关文章

  • leetcode 65. 有效数字 66. 寻找两个正序数组的中位数
    leetcode65.有效数字66.寻找两个正序数组的中位数65.有效数字难度困难295有效数字(按顺序)可以分成以下几个部分:一个小数或者整数(可选)一个'e'或'E',后面跟着一个整数小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+'或'-')下述格式之一:至少一位数字,后面跟着一个......
  • 企业数字化转型的数据在哪里找?
    企业数字化转型的数据主要来自于两个方面,一个是通过工业物连的方式直接采集到的工业设备、传感器等参与生产制造物流运输各方面的生产数据及工况数据等,另一方面就是企业员工输入以及一些智能化工具比如软件机器人收集到的数据,这类主要包含业务数据、商务数据等,但无论是生产数据还......
  • 人民日报推荐的Excel表格打印技巧,太实用了!(推荐收藏)
    用Excel制作表格人人都会,但你能把表格打印得精准无误、无缺无漏吗?工作表很长,可只有第一页有标题行?明明只想打一页纸,却总是多两行数据跑到第二页上?人民日报推荐的Excel表格打印技巧,推荐收藏,有用!好了,以上就是今天的Excel干货技巧分享,你Get到了吗?别忘记动手练习鸭~小技巧也有大作用,每......
  • 表格软件有哪些?热门表格软件推荐
    作为报表开发人员,我们经常需要使用各种表格软件来处理数据并生成清晰、易读的报表。在市面上,有许多不同类型的表格软件可供选择。下面我将列举7款热门的表格软件,并详细介绍其中一款优秀的软件—VeryReport。编辑搜图请点击输入图片描述(最多18字)1.VeryReport表格软件VeryReport是一......
  • 13. 罗马数字转整数
    class Solution {        Map<Character, Integer> maps = new HashMap<>(){{        put('I', 1);        put('V', 5);        put('X', 10);        put('L', 50);        put('C', 100);       ......
  • 12. 整数转罗马数字
      贪心策略:classSolution{int[]values={1000,900,500,400,100,90,50,40,10,9,5,4,1};String[]symbols={"M","CM","D","CD","C","XC","L","XL","X","IX&q......
  • 一. 数字图像处理基础
    一.数字图像处理基础1.1图像表示图像就是矩阵,在python中表示为数组形式。1.2图像模型1.2.1RGB模型R:红,【0,255】G:绿B:蓝EG:#FF255255255:以两位为跨度,前两位为透明度,随后依次为:R、G、B模型如下:1.2.2HSI模型H(Hue,色调):与光波的波长有关,表示人的感官对不同颜色的感......
  • 实现表格中各单元格字段都支持自定义点灯的思路
    1.数据库,增加一个点灯信息字段:内容为json字符串存储,key即为每个列的字段名,内容就为点灯颜色。eg:lightInfo:{"name":"red","id":"blue"}2.前台用lightInfo[该列对应的具体的字段名]动态获取对应字段的点灯信息。3.前台点灯的编辑方式,可以采用vxetable右键menuConfig或是......
  • DiscoTOC - 自动内容表格
    示例桌面移动终端  特性toc=tableofcontents(内容列表)通过菜单上面的设置按钮,根据当前内容的状况一键生成toc列表Toc将会一直在页面中尽显显示——滚动内容与topic的链接是同步的当你滚动过当前页面中中的主题的时候,对应这个主题的内容列表将会使用高亮来......
  • DiscoTOC - 自动内容表格
    示例桌面移动终端  特性toc=tableofcontents(内容列表)通过菜单上面的设置按钮,根据当前内容的状况一键生成toc列表Toc将会一直在页面中尽显显示——滚动内容与topic的链接是同步的当你滚动过当前页面中中的主题的时候,对应这个主题的内容列表将会使用高亮来进行显示(显示......