题目大意:有一个$n\times m$的方格图,求其中所有的格点正方形完整包含的小方格个数,多组询问。$n,m\leqslant 10^6$

题解:令$n\leqslant m$。有一个显然的式子:
$$
ans=\sum\limits_{i=1}^n(n-i+1)(m-i+1)f(i)
$$
$f(i)$表示可以完整包含在$i\times i$的正方形中且顶点在这个正方形边上的正方形所包含的小方格总数。可以分选的正方形和$i\times i$正方形重合和边转动$j$格来计算
$$
f(n)=n^2+\sum\limits_{i=1}^{n-1}[(n-2\max\{i,n-1\})^2+g(i,n-i)]
$$
其中$(n-2\max\{i,n-1\})^2$是转动$i$格后正中间的完整小方格,$g(i,n-i)$表示四周的$4$个小直角三角形中包含的完整小方格个数。

比如计算左上角的直角三角形,发现完整的小方格的左上角满足在直角三角形的斜边上或三角形内。三角形内的点可以用皮克定理来解决,令三角形两直角边为$n,m$,则三角形内的点个数为$\dfrac{nm-n-m+2-\gcd(n,m)}2$,再加上在斜边上的点,则一个直角三角形内的方格数为$\dfrac{nm-m-n+gcd(n,m)}2$。

把$n=i,m=n-i$带入式子
$$
\begin{align*}
f(n)=&n^2+\sum\limits_{i=1}^{n-1}[(n-2\max\{i,n-1\})^2+g(i,n-i)]\\
    =&n^2+\sum\limits_{i=1}^{n-1}(n-2\max\{i,n-1\})^2+\sum\limits_{i=1}^{n-1}g(i,n-i)\\
    =&n^2+\sum\limits_{i=1}^{\left\lfloor\frac{n-1}2\right\rfloor}(n-2i)^2+\sum\limits_{i=\left\lfloor\frac{n-1}2\right\rfloor+1}^{n-1}(2i-n)^2\\
    &+\sum\limits_{i=1}^{n-1}\dfrac{i(n-i)-(n-i)-i+\gcd(i,n-i)}2\\
    =&n^2+2\sum\limits_{i=1}^{\left\lfloor\frac{n-1}2\right\rfloor}(n-2i)^2+\sum\limits_{i=1}^{n-1}\dfrac{in-i^2-n+\gcd(i,n)}2
\end{align*}
$$
其中$n^2$可以快速计算,$\sum\limits_{i=1}^{\left\lfloor\frac{n-1}2\right\rfloor}(n-2i)^2$可以前缀和解决,问题在$\sum\limits_{i=1}^{n-1}\dfrac{in-i^2-n+\gcd(i,n)}2$部分。令$h(n)=\sum\limits_{i=1}^{n-1}\dfrac{in-i^2-n+\gcd(i,n)}2$,$sgcd(n)=\sum\limits_{i=1}^{n-1}\gcd(i,n)$
$$
h(n)=\dfrac12[\sum\limits_{i=1}^{n-1}(in-i^2-n)+sgcd(n)]\\
\begin{align*}
h(n-1)&=\dfrac12[\sum\limits_{i=1}^{n-2}(i(n-1)-i^2-(n-1))+sgcd(n-1)]\\
    &=\dfrac12[\sum\limits_{i=1}^{n-2}(in-i^2-n-i+1)+sgcd(n-1)]\\
\end{align*}\\
$$
$$
\begin{align*}
h(n)=&h(n-1)+\dfrac12[\sum\limits_{i=1}^{n-2}(i-1)+(n-1)n-(n-1)^2-n\\
    &-sgcd(n-1)+sgcd(n)]\\
    =&h(n-1)+\dfrac12[\left(\sum\limits_{i=0}^{n-3}i\right)-1-sgcd(n-1)+sgcd(n)]\\
    =&h(n-1)+\dfrac12[\left(\dfrac{(n-2)(n-3)}2\right)-1-sgcd(n-1)+sgcd(n)]
\end{align*}
$$

其他部分都可以快速求出,问题在求$sgcd(n)$
$$
\begin{align*}
sgcd(n)&=\sum\limits_{i=1}^{n-1}\gcd(i,n)\\
    &=\left(\sum\limits_{d|n}\dfrac nd\varphi(d)\right)-n
\end{align*}
$$
全部预处理出来即可。

卡点:

C++ Code:

#include <cstdio>
#include <algorithm>
#include <iostream>
#define mul(a, b) (static_cast<long long> (a) * (b) % mod)
const int mod = 1e9 + 7, maxn = 1e6 + 10, half = (mod + 1) / 2;
inline void reduce(int &x) { x += x >> 31 & mod; } int gcd(int a, int b) {
if (!b) return a;
return gcd(b, a % b);
}
inline int sqr(int x) { return mul(x, x); } int g[maxn], sumgcd[maxn], phi[maxn], plist[maxn / 2], ptot;
int pre[maxn], R[maxn], T[maxn], preF[maxn];
bool notp[maxn];
int Q; int F(int n) {
int ans = g[n];
reduce(ans += sqr(n) - mod);
reduce(ans += pre[n - 2] - mod);
reduce(ans += pre[n - 2] - mod);
return ans;
}
void sieve(int N) {
phi[1] = 1;
for (int i = 2; i <= N; i++) {
if (!notp[i]) phi[plist[ptot++] = i] = i - 1;
for (int j = 0, t; j < ptot && (t = i * plist[j]) <= N; j++) {
notp[t] = true;
if (i % plist[j] == 0) {
phi[t] = phi[i] * plist[j];
break;
}
phi[t] = phi[i] * phi[plist[j]];
}
}
for (int i = 1; i <= N; ++i) {
for (int j = i + i; j <= N; j += i) reduce(sumgcd[j] += mul(phi[j / i], i));
}
for (int i = 4; i <= N; ++i) {
g[i] = (1ll * (i - 3) * (i - 2) / 2 - 1 - sumgcd[i - 1] + sumgcd[i]) % mod;
reduce(g[i]);
g[i] = mul(g[i], half);
reduce(g[i] += g[i - 1] - mod);
}
for (int i = 1; i <= N; ++i) g[i] = mul(g[i], 4);
pre[1] = 1;
for (int i = 2; i <= N; ++i) reduce(pre[i] = pre[i - 2] + sqr(i) - mod);
for (int i = 1; i <= N; ++i) reduce(preF[i] = preF[i - 1] + F(i) - mod);
for (int i = 1; i <= N; ++i) {
reduce(R[i] = R[i - 1] + preF[i - 1] - mod);
reduce(R[i] += F(i) - mod);
}
for (int i = 1; i <= N; ++i) {
reduce(T[i] = T[i - 1] + preF[i - 1] - mod);
reduce(T[i] += R[i - 1] - mod);
reduce(T[i] += R[i - 1] - mod);
reduce(T[i] += F(i) - mod);
}
}
int solve(int n, int m) {
int ans = T[n];
reduce(ans += mul(R[n], m - n) - mod);
return ans;
} int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
sieve(1000005);
std::cin >> Q;
while (Q --> 0) {
static int n, m;
std::cin >> n >> m;
if (n > m) std::swap(n, m);
std::cout << solve(n, m) << '\n';
}
return 0;
}

  

CF449E Jzzhu and Squares的更多相关文章

  1. soj#552 449E Jzzhu and Squares

    分析 https://www.cnblogs.com/Memory-of-winter/p/11209128.html 代码 #include<bits/stdc++.h> using n ...

  2. CF449 (Div. 1简单题解)

    A .Jzzhu and Chocolate pro:现在给定一个大小为N*M的巧克力,让你横着或者竖着切K刀,都是切的整数大小,而且不能切在相同的地方,求最大化其中最小的块. (N,M,K<1 ...

  3. Codeforces Round #257 (Div. 1)449A - Jzzhu and Chocolate(贪婪、数学)

    主题链接:http://codeforces.com/problemset/problem/449/A ------------------------------------------------ ...

  4. Codeforces Round #257 (Div. 2) C. Jzzhu and Chocolate

    C. Jzzhu and Chocolate time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. cf 450c Jzzhu and Chocolate

    Jzzhu and Chocolate time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. Codeforces 450C:Jzzhu and Chocolate(贪心)

    C. Jzzhu and Chocolate time limit per test: 1 seconds memory limit per test: 256 megabytes input: st ...

  7. [LeetCode] Word Squares 单词平方

    Given a set of words (without duplicates), find all word squares you can build from them. A sequence ...

  8. 卡通图像变形算法(Moving Least Squares)附源码

    本文介绍一种利用移动最小二乘法来实现图像变形的方法,该方法由用户指定图像中的控制点,并通过拖拽控制点来驱动图像变形.假设p为原图像中控制点的位置,q为拖拽后控制点的位置,我们利用移动最小二乘法来为原图 ...

  9. Leetcode: Word Squares && Summary: Another Important Implementation of Trie(Retrieve all the words with a given Prefix)

    Given a set of words (without duplicates), find all word squares you can build from them. A sequence ...

随机推荐

  1. 用Python操作MySQL(pymysql)

    用python来操作MySQL,首先需要安装PyMySQL库(pip install pymysql). 连接MySQL: import pymysql connect=pymysql.connect ...

  2. Java后台读取excel表格返回至Web前端

    如果是做连接数据库的话,系统难度就降低了不少:这次本人也算是体会到数据库的方便了吧(不过以后云储存好像会更受欢迎些):比如说查询列出所有数据吧:数据库每个表每一列都有列名,正常的做法是遍历数据库表,d ...

  3. Tcl条件语句

    If {条件表达式1} { 执行语句1 } elseif {条件表达式2} { 执行语句2 } elseif {条件表达式3} { 执行语句3 } else { 执行语句4 } 注:elseif {条 ...

  4. java.sql.SQLException: Data truncated for column 'seat_number' at row 1

    项目中try catch 出现这种情况,就去检查下数据库列类型和项目中实体类的id类型是否一致.数据库id是int类型的,项目实体类是String类型的,项目save功能无法保存,导致了我的这个异常.

  5. Calcite分析 - RelTrait

    RelTrait 表示RelNode的物理属性 由RelTraitDef代表RelTrait的类型 /** * RelTrait represents the manifestation of a r ...

  6. 转载:Base64编解码介绍

    https://www.liaoxuefeng.com/wiki/897692888725344/949441536192576 Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打 ...

  7. odoo开发笔记 -- 模型后台方法返回前端form视图和tree视图的写法

    待补充: 参考:工作单跳转到通关清单 --form(一对一) 工作单跳转到报关单列表 --tree (一对多)

  8. http请求传参问题解决

    1.接口参数:使用form-data形式传参如果值太多就会报错误. 2.接口参数:使用form-data形式传参如果值太多就会报错误.这样前端可以传json就可以避免这样问题

  9. Docker搭建Kafka

    下载Kafka和Zookeeper镜像文件 1,docker pull wurstmeister/kafka 2,docker pull wurstmeister/zookeeper 先运行zk,再运 ...

  10. netty-websocket-spring-boot-starter关闭报错 io/netty/channel/AbstractChannel$AbstractUnsafe io/netty/util/concurrent/GlobalEventExecutor

    报错 java.lang.NoClassDefFoundError: io/netty/channel/AbstractChannel$AbstractUnsafe$ at io.netty.chan ...