Description

背景

有一天,小Q梦见自己来到了理想国的幻想之乡。

描述

有一天,小Q梦见自己来到了理想国的幻想之乡。幻想乡有无穷户居民,第i个家庭住在编号为i的房屋里,编号从1开始,到正无穷。

居民们的房屋之间有着许多种道路,其中第k种道路只连接在编号为k的倍数且在k的倍数中连续的房屋之间。例如第1种道路连接在编号为(1,2),(2,3),(3,4)…的房屋之间,而第3种道路只连接在编号为(3,6),(6,9),(9,12)…的房屋之间。

小Q要抓紧睡梦的时间来拜访幻想之乡中的贵人,他希望你能帮他完成这场幻想之旅。他经常会从某个编号为i的房屋只走某种道路快速到达某个编号为j的房屋,比如说从编号为4的房屋走到编号为8的房屋,可以走4->5->6->7->8,也可以走4->6->8,甚至可以走4->8一步到达目的地。

他很好奇,如果他的起点房屋的编号是不大于n的,终点房屋的编号是不大于m的,对于所有可能的起点与终点,他最少会走多少条路,注意他的移动只会选择一种道路。

为了避免精度误差,他希望你能告诉他所有可能的起点与终点所对应的经过的最少边数之和。

由于这个数可能超过1018,但是不会很大,所以你只需要求出它对两个质数109+7和10^9+9的模值即可,小Q的数学很好,他会算出原来的答案

Input

第一行一个正整数T,表示小Q有T组好奇的问题。

接下来是T组问题,每组问题占一行,共两个正整数n, m,空格隔开。

Output

共T行,每行两个空格隔开的整数,表示每组问题分别模109+7和109+9的答案。

Sample Input

2

3 3

2 4

Sample Output

8 8

9 9

HINT

100%的数据 T <= 1000, n, m <= 2*10^6

Solution

题意有点迷...其实就是求

\[\sum_{i=1}^n\sum_{j=1}^m\frac{|i-j|}{gcd(i,j)}
\]

大力推式子

然后就能出来这个(写这题的应该都能推到这里吧...)

\[\begin{aligned}
&设sum(n,m)=\sum_{i=1}^n\sum_{j=1}^{m}|i-j|\\
&则原式=\sum_{T=1}^{n}sum(\frac{n}{T},\frac{m}{T})\sum_{k|T}k\mu(k)
\end{aligned}
\]

后面那段是个积性函数直接线性筛就好。

怎么筛肯定都会...不会就去重学一下线性筛吧..反正就是分类讨论。这里证明一下这个为什么是个积性函数

我们设

\[f(i)=i\mu(i)
\]

那么

\[\begin{aligned}
&设x,y互质\\
&f(xy)\\
&=x*y*\mu(xy)\\
&=x*y*\mu(x)*\mu(y)\\
&=x*\mu(x)*y*\mu(y)\\
&=f(x)f(y)
\end{aligned}
\]

所以说这是个积性函数。

我们用狄利克雷卷积把它跟恒等函数\(I\)卷起来

\[\begin{aligned}
&f*I\\
&=\sum_{d|n}f(d)\\
&=\sum_{d|n}d\mu(d)
\end{aligned}
\]

两个积性函数的狄利克雷卷积也是积性函数。

证毕。

重点在前面那一块。

我们考虑来拆一下。

当\(n=m\)时

\[\begin{aligned}
sum(n,m)
&=\sum_{i=1}^n\sum_{j=1}^{n}|i-j|\\
&=2*\sum_{i=1}^n\sum_{j=1}^{i}i-j\\
&=2*\sum_{i=1}^{n}\left(\sum_{j=1}^{i}i-\sum_{j=1}^{i}j \right)\\
&=2*\sum_{i=1}^{n}\left(i^2-\frac{i(i+1)}{2} \right)\\
&=\sum_{i=1}^{n}2i^2-i(i+1)\\
&=\sum_{i=1}^{n}i(2i-i-1)\\
&=\sum_{i=1}^{n}i^2-i\\
&=\sum_{i=1}^ni^2-\sum_{i=1}^ni\\
&=\frac{n(n+1)(2n+1)}{6}-\frac{n(n+1)}{2}\\
&=\frac{n(n+1)(n-1)}{3}
\end{aligned}
\]

把这个玩意看成一个矩形,那么当我们解决了一个正方形之后,显然就剩下一个小的矩形,我们来处理一下这个小矩形。

不妨设\(n<m\)

\[\begin{aligned}
&\sum_{i=1}^{n}\sum_{j=n+1}^{m}j-i\\
&=\sum_{i=1}^{n}\left(\sum_{j=n+1}^{m}j-\sum_{j=n+1}^mi \right)\\
&=\sum_{i=1}^{n}\left(\frac{(n+1+m)(m-n)}{2}-(m-n)i \right)\\
&=\frac{n(n+1+m)(m-n)}{2}-\frac{n(n+1)(m-n)}{2}\\
&=\frac{nm(m-n)}{2}
\end{aligned}
\]

所以这就是网上那个式子的由来了。。。但是我看其他blog都完全没有推导。

\[\begin{aligned}
&sum(n,m)(n<m)\\
&=\sum_{i=1}^n\sum_{j=1}^{n}|i-j|\\
&=\frac{n(n+1)(n-1)}{3}+\frac{nm(m-n)}{2}
\end{aligned}
\]

然后不知道为什么还要两个模数。。。完全就是增加代码量。。。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 2000010
const ll inf = 1e18;
const ll mod1 = 1e9 + 7;
const ll mod2 = 1e9 + 9;
int T, cnt;
ll n, m, F[2][N];
int p[N], vis[N]; void init() {
F[0][1] = F[1][1] = 1;
for(int i = 2; i < N; ++i) {
if(!vis[i]) p[++cnt] = i, F[0][i] = (1 - i + mod1) % mod1, F[1][i] = (1 - i + mod2) % mod2;
for(int j = 1; j <= cnt && p[j] * i < N; ++j) {
vis[i * p[j]] = 1;
if(i % p[j] == 0) {
F[0][i * p[j]] = F[0][i];
F[1][i * p[j]] = F[1][i];
break;
}
F[0][i * p[j]] = F[0][i] * F[0][p[j]] % mod1;
F[1][i * p[j]] = F[1][i] * F[1][p[j]] % mod2;
}
}
for(int i = 1; i < N; ++i) F[0][i] += F[0][i - 1], F[0][i] %= mod1, F[1][i] += F[1][i - 1], F[1][i] %= mod2;
} ll calc1(ll n, ll m, ll mod) {
if(!n || !m) return 0;
if(n > m) swap(n, m);
ll sum1 = n * (n + 1) * (n - 1) / 3 % mod;
ll sum2 = n * m * (m - n) / 2 % mod;
return (sum1 + sum2) % mod;
} ll calc_1(ll n, ll m) {
ll ans = 0;
for(ll l = 1, r; l <= n; l = r + 1) {
r = min(n / (n / l), m / (m / l));
ans += calc1(n / l, m / l, mod1) * (F[0][r] - F[0][l - 1] + mod1) % mod1;
ans %= mod1;
}
return ans;
} ll calc_2(ll n, ll m) {
ll ans = 0;
for(ll l = 1, r; l <= n; l = r + 1) {
r = min(n / (n / l), m / (m / l));
ans += calc1(n / l, m / l, mod2) * (F[1][r] - F[1][l - 1] + mod2) % mod2;
ans %= mod2;
}
return ans;
} int main() {
scanf("%d", &T);
init();
while(T--) {
scanf("%lld%lld", &n, &m);
if(n > m) swap(n, m);
printf("%lld %lld\n", calc_1(n, m), calc_2(n, m));
}
}

BZOJ4018: 小Q的幻想之乡的更多相关文章

  1. 平面直接坐标系线段相交问题(小Q(钟神)的问题)

    [问题描述] 小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点.随后,他将 ...

  2. hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  3. HD4505小Q系列故事——电梯里的爱情

    Problem Description 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯里,小Q ...

  4. hdu4505小Q系列故事——电梯里的爱情

    小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  5. HDU-4515 小Q系列故事——世界上最遥远的距离

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  6. 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流 ---好水!!

    我以为我会是最坚强的那一个 我还是高估了自己 我以为你会是最无情的那一个 还是我贬低了自己 就算不能够在一起 我还是为你担心 就算你可能听不清 也代表我的心意 那北极星的眼泪 闪过你曾经的眼角迷离 那 ...

  7. HDU4530:小Q系列故事——大笨钟

    Problem Description 饱尝情感苦恼的小Q本打算隐居一段时间,但仅仅在3月25号一天没有出现,就有很多朋友想念他,所以,他今天决定再出来一次,正式和大家做个告别. 小Q近来睡眠情况很差 ...

  8. 欢迎大家关注我的微信公众帐号小q机器人(xiaoqrobot)(转)

    一个偶然的机会让我接触到了微信公众平台,赶紧加了几个交流群了解下相关情况,突然间发现好像全部的APP开发人员都在研究微信公众帐号的开发,而我显得有些落舞了.至于为什么热度会这么高,我想一个数字足以说明 ...

  9. HDU 4520 小Q系列故事——最佳裁判

    Time Limit : 500/200ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Problem Description 过 ...

随机推荐

  1. 取n的第k位

    实例二:取n的第k位 方法:a>> k & 1 某值a右移K位后与整数“1”进行与运算.即把需要第几位就右移几位. 例子: 0000 1000 ------8右移3位 0000 0 ...

  2. html5-progress和meter用法

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  3. tomcat的JVM调优

    1.error场景 Tomcat 长期运行过程遇到Caused by: java.lang.OutOfMemoryError: PermGen space或java.lang.OutOfMemoryE ...

  4. .net web site 和 web application 的区别

    web application 会把所有的代码编译打包成单一的库文件(.dll). web site 不会对整个的代码进行编译,在运行时须要哪一段代码就编译哪段代码.这导致web site 上线后,如 ...

  5. Ontology Relations

    Overview The following page documents the relations used in the filtered GO ontology. For informatio ...

  6. linux lsof用法

    linux lsof命令详解   简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可 ...

  7. python内置函数zip

    zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以 ...

  8. 使用SpringBoot的优势。

    Spring Boot 让开发变得更简单 Spring Boot 对开发效率的提升是全方位的,我们可以简单做一下对比: 在没有使用 Spring Boot 之前我们开发一个 web 项目需要做哪些工作 ...

  9. GUI保存打开对话框

    %uigetfile uigetfile doc uigetfile %规定打开文件类型 uigetfile('*.m'); %输出参数意义 [a,b,c] = uigetfile('*.m');%a ...

  10. GIT 分布式版本控制系统的简单使用介绍

    GIT 分布式版本控制系统的简单使用介绍 1.GIT的概念Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 与 SVN 区别:1. GIT不仅仅是个版本控制系统,它 ...