luogu4449 于神之怒加强版(莫比乌斯反演)
给定n,m,k,计算\(\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^k\)对1000000007取模的结果
多组数据,T<=2000,1<=N,M,K<=5000000
推式子
\(\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^k\)
\(=\sum_{p=1}^np^k\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=p]\)
\(=\sum_{p=1}^np^{k}\sum_{i=1}^{n/p}\sum_{j=1}^{m/p}[\gcd(i,j)=1]\)
\(=\sum_{p=1}^np^{k}\sum_{i=1}^{n/p}\sum_{j=1}^{m/p}\sum_{d|i,d|j}\mu(d)\)
\(=\sum_{p=1}^np^{k}\sum_{d=1}^n\mu(d)\lfloor\frac n{dp}\rfloor\lfloor\frac m{dp}\rfloor\)
\(=\sum_{q=1}^n\sum_{p|q}p^{k}\mu(\frac qp)\lfloor\frac n{q}\rfloor\lfloor\frac m{q}\rfloor\)
注意这里求得是个数,不需要提出\(p^2\)和\(d^2\),我式子推错了两次。。。
还是枚举倍数对于所有q处理\(\sum_{p|q}p^{k}\mu(\frac qp)\),然后打数论分块
注意这里如果定义p为1e9+7就不要再用p了。。。
#include <cstdio>
#include <functional>
using namespace std;
int n, prime[5000010], mu[5000010], tot, fuck = 5000000, p = 1000000007;
int s[5000010];
bool vis[5000010];
int qpow(int x, int y)
{
int res = 1;
while (y > 0)
{
if (y & 1) res = res * (long long)x % p;
x = x * (long long)x % p;
y >>= 1;
}
return res;
}
int main()
{
int t, k; scanf("%d%d", &t, &k);
mu[1] = 1;
for (int i = 2; i <= fuck; i++)
{
if (vis[i] == 0) prime[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && i * prime[j] <= fuck; j++)
{
vis[i * prime[j]] = true;
if (i % prime[j] == 0) break;
mu[i * prime[j]] = -mu[i];
}
}
for (int pp = 1; pp <= fuck; pp++)
{
int sb = qpow(pp, k);
for (int q = pp, d = 1; q <= fuck; q += pp, d++)
s[q] = (s[q] + sb * mu[d]) % p;
}
for (int i = 1; i <= fuck; i++)
{
// printf("s[%d] = %d\n", i, s[i]);
s[i] = (s[i] + s[i - 1]) % p;
}
while (t --> 0)
{
int n, m, ans = 0;
scanf("%d%d", &n, &m); if (n > m) swap(n, m);
for (int i = 1, j; i <= n; i = j + 1)
j = min(n / (n / i), m / (m / i)), ans = (ans + (s[j] - s[i - 1]) * (long long)(n / i) % p * (m / i) % p) % p;
if (ans < 0) ans += p;
printf("%d\n", ans);
}
return 0;
}
56行,交上去一遍A
luogu4449 于神之怒加强版(莫比乌斯反演)的更多相关文章
- 【BZOJ-4407】于神之怒加强版 莫比乌斯反演 + 线性筛
4407: 于神之怒加强版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 241 Solved: 119[Submit][Status][Discu ...
- BZOJ 4407 于神之怒加强版 (莫比乌斯反演 + 分块)
4407: 于神之怒加强版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 1067 Solved: 494[Submit][Status][Disc ...
- BZOJ4407 于神之怒加强版 - 莫比乌斯反演
题解 非常裸的莫比乌斯反演. 但是反演完还需要快速计算一个积性函数(我直接用$nlogn$卷积被TLE了 推荐一个博客 我也不想再写一遍了 代码 #include<cstring> #in ...
- 【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛
题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 ...
- 【BZOJ4407】于神之怒加强版 莫比乌斯反演
[BZOJ4407]于神之怒加强版 Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行, ...
- 洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演
https://www.luogu.org/problemnew/show/P4449 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i, ...
- BZOJ 4407: 于神之怒加强版 [莫比乌斯反演 线性筛]
题意:提前给出\(k\),求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m gcd(i,j)^k\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d|D ...
- BZOJ4407: 于神之怒加强版(莫比乌斯反演 线性筛)
Description 给下N,M,K.求 感觉好迷茫啊,很多变换看的一脸懵逼却又不知道去哪里学.一道题做一上午也是没谁了,, 首先按照套路反演化到最后应该是这个式子 $$ans = \sum_{d ...
- BZOJ.4407.于神之怒加强版(莫比乌斯反演)
题目链接 Description 求\[\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^K\ \mod\ 10^9+7\] Solution 前面部分依旧套路. \[\begin{ ...
随机推荐
- The connection to adb is down and a sever error has occured的解决
1. 打开任务管理器,关掉豌豆夹等手机助手 2. 打开命令行,切换到adb所在目录,如:C:\Users\Jubincn\Downloads\adt-bundle-windows-x86_64-201 ...
- 11-19网页基础--第二部分CSS样式表基本概念
CSS,全称(Cascading Style Sheets,层叠样式表),作用是美化HTML网页. 一.基本概念:是用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言. 你可能对C ...
- 没有dig命令的结觉方法
-bash: dig: command not found rpm -qa bind-utils 查看没有没安装 bind-utils 包 yum install -y bind-utils 解决
- Python之tuple的创建以及使用
tuple又是一种有序列表,它与list只有两种不同:1.创建后不能更改.2.创建时得用() 在使用tuple的时候我们需要进行那个添加一个“,” 如果不加的话就是一个整数. 但是tuple作为一个不 ...
- python爬虫实战(2)--爬取百度贴吧
本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 先观察百度贴吧url格式,以中南财经政法大学迎新帖为例,URL我们 ...
- OpenCV4Android 不需要安装OpenCVManager,就可以运行的方法
http://blog.csdn.net/yanzi1225627/article/details/27863615 OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种 ...
- springmvc 注解式开发 解决中文乱码问题
- ssh整合(dao使用hibernateTemplate)
- 手动编译安装tmux
tmux的好处就不多说了,总之是多屏管理的神器.通常我们用系统通用的安装方式可以安装到tmux,但有时候,安装到的可能不是我们所需要的版本,又或者软件源里面没有带tmux.这个时候就需要手动编译安装了 ...
- IFC—IfcProduct实体继承框架