Description:


1<=T<=10000,1<=n<=4000

题解:

好久没有比赛时切这么恶心的数论题了。

显然的想法是枚举直线的斜率,再把这条直线塞到矩形里,平行于坐标轴的直线特判一下就行了。

枚举斜率就是枚举个i,j,斜率就是j/i,保证(gcd(i, j) =1)就不会重复,斜率为负的是一样的,最后乘一个2即可。

最后一个问题这条直线能塞到多少个地方。可以这么想:这条直线占了一个i*j的矩形,那就有(n-i+1)*(m-j+1)个位置可以塞。

但是这样显然是错的,因为会出现下图这种情况:

这两条直线存在于两个不同的矩形中,但是实际上是一条直线。

于是我们会想到枚举矩形的左上角,只要没有矩形以左上角为右下角,那么这个矩形就是合法的。

总结一下可得:
Ans=∑n−1i=1∑m−1j=1[gcd(i,j)=1]∗∑n−ix=1∑m−jy=1[x<=i  or  y<=j]Ans = \sum_{i = 1}^{n - 1} \sum_{j = 1}^{m - 1} [gcd(i, j) = 1] * \sum_{x = 1}^{n -i}\sum_{y = 1}^{m - j}[x

有gcd,就可以反演了。
为了方便,接下来的n,m都减了1。

=∑ni=1∑mj=1∑d|gcd(i,j)μ(d)∗∑n−i+1x=1∑m−j+1y=1[x<=i  or  y<=j]= \sum_{i = 1}^{n} \sum_{j = 1}^{m} \sum_{d | gcd(i, j)} μ(d)* \sum_{x = 1}^{n -i+1}\sum_{y = 1}^{m - j+1}[x
∑nd=1μ(d)∗∑⌊nd⌋i=1∑⌊md⌋j=1∑n−i∗d+1x=1∑m−j∗d+1y=1[x<=i∗d  or  y<=j∗d]\sum_{d = 1}^n μ(d)*\sum_{i = 1}^{\lfloor {n \over d}\rfloor} \sum_{j = 1}^{\lfloor {m \over d}\rfloor}\sum_{x = 1}^{n -i*d+1}\sum_{y = 1}^{m - j*d+1}[x
容斥一下,易得:
=∑nd=1μ(d)∗∑⌊nd⌋i=1∑⌊md⌋j=1(∑n−i∗d+1x=1[x<=i∗d]∗(m−j∗d+1))+(∑m−j∗d+1y=1[y<=j∗d]∗(n−i∗d+1)))−(∑n−i∗d+1x=1∑m−j∗d+1y=1[x<=i∗d  and  y<=j∗d])=\sum_{d = 1}^n μ(d)*\sum_{i = 1}^{\lfloor {n \over d}\rfloor} \sum_{j = 1}^{\lfloor {m \over d}\rfloor}(\sum_{x = 1}^{n -i*d+1}[x
=∑nd=1μ(d)∗(∑⌊nd⌋i=1∑n−i∗d+1x=1[x<=i∗d]∗∑⌊md⌋j=1(m−j∗d+1))+(∑⌊md⌋j=1∑m−j∗d+1y=1[y<=j∗d]∗∑⌊nd⌋i=1(n−i∗d+1))−((∑⌊nd⌋i=1∑n−i∗d+1x=1[x<=i∗d]∗(∑⌊md⌋j=1∑m−j∗d+1y=1[y<=j∗d])=\sum_{d = 1}^n μ(d)*(\sum_{i = 1}^{\lfloor {n \over d}\rfloor}\sum_{x = 1}^{n -i*d+1}[x

于是暴力枚举d,可以利用等差数列求和快速算出所需的东西。

时间复杂度:O(T∗n)O(T*n)

这题是2016计蒜客联想的显示屏校准(困难)的一个部分分,实际上式子还可以化简,一个查询是O(n√)O(\sqrt n),在这里不再继续推了。

Code:

#include<cstdio>
#include<algorithm>
#define ll long long
#define fo(i, x, y) for(int i = x; i <= y; i ++)
using namespace std;const int mo = 1 << 30;const int N = 4000;
int T, n, m, p[N], mu[N + 5];
bool bz[N + 5];
ll ans;void Build() {mu[1] = 1;fo(i, 2, N) {if(!bz[i]) p[++ p[0]] = i, mu[i] = -1;fo(j, 1, p[0]) {int k = i * p[j];if(k > N) break;bz[k] = 1;if(i % p[j] == 0) {mu[k] = 0; break;}mu[k] = -mu[i];}}
}int main() {Build();for(scanf("%d", &T); T; T --) {scanf("%d %d", &n, &m);if(n > m) swap(n, m);n --; m --;ans = 0;fo(i, 1, n) if(mu[i] != 0)  {int sf, sg;int c = n / i, c2 = (n + 1) / 2 / i, s;sf = (1 + c2) * c2 / 2 * i;sf += (n + 1) * (c - c2) - (c2 + 1 + c) * (c - c2) / 2 * i;c = m / i, c2 = (m + 1) / 2 / i, s;sg = (1 + c2) * c2 / 2 * i;sg += (m + 1) * (c - c2) - (c2 + 1 + c) * (c - c2) / 2 * i;int s1 = (n + 1) * (n / i) - (n / i) * (n / i + 1) * i / 2;int s2 = (m + 1) * (m / i) - (m / i) * (m / i + 1) * i / 2;ans += mu[i] * (sf * s2 + sg * s1 - sf * sg);}ans *= 2; ans += n + m + 2;ans = (ans % mo + mo) % mo;printf("%lld\n", ans);}
}

【NOIP2017提高A组模拟8.25】夜莺与玫瑰相关推荐

  1. 【jzoj5337】【NOIP2017提高A组模拟8.25】【夜莺与玫瑰】【莫比乌斯反演】

    description solution 我们可以发现一个性质 ans=n+m+∑n−1i=1∑j=1m−1([(i,j)==1](n−i)(m−j)−[(i,j)==2](n−i)(m−j))ans ...

  2. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  3. JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜

    Description 由于众所周知的原因, 冈部一直欠真由理一串香蕉. 为了封上真由理的嘴, 冈部承诺只要真由理回答出这个问题, 就给她买一车的香蕉: 一开始有n 个人围成一个圈, 从1 开始顺时针 ...

  4. JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation

    Description Input Output Sample Input 7 2 2343223 4 1 2234 Sample Output 2243233 2334 Data Constrain ...

  5. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...

  6. JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异

    Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...

  7. JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度

    Description Input Output Sample Input Sample1: 3 1 2 3 Sample2: 9 1 3 2 4 8 6 9 5 7 Sample Output Sa ...

  8. JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情

    Description Input 输入文件第一行包含一个正整数 k.之后是 k 组测试用例. 每组测试用例的第一行为一个整数 n.接下来 n 行,每行 n 个以空格隔开的数,用来 描述棋盘的初始状态 ...

  9. JZOJ 100026. 【NOIP2017提高A组模拟7.7】图

    Description 有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发 ...

最新文章

  1. 素数推断算法(高效率)
  2. Android 多媒体------相机
  3. sdut-1118 C语言实验——从大到小输出a、b、c(选择结构)
  4. IOS开发数据库篇—SQLite模糊查询
  5. 学习笔记(18):Python网络编程并发编程-守护进程
  6. Hadoop MapReduce概念学习系列之MPI和MapReduce(十三)
  7. datepicker动态初始化
  8. 以社会工程学助力网络安全
  9. Oracle DBA必须学会的11个Linux基本命令
  10. form标签的action之前 加密_口令爆破之突破前端JS加密
  11. 开源中国开源世界高峰论坛
  12. Java自学路线图之Java进阶自学
  13. PDM,读《电商产品经理宝典:电商后台系统产品逻辑全解析》
  14. 新手十分钟玩转淘宝客推广攻略
  15. 华为HCNA路由技术篇—OSPF协议细节详解
  16. 数据分析上海长租房市场
  17. Material Design学习总结
  18. 小猪的Python学习之旅 —— 1.基础知识储备
  19. 中山川田是一家什么样的企业
  20. 当今程序员很厉害?不!那是你不了解上古时期的那些神级操作

热门文章

  1. JavaScript 入门哪本书最好?(问、答) 《转载》
  2. [NIKON D80]校园中的日落
  3. VulnStack-ATTCK-3(红日靶场三)
  4. 怎么查看linux有多少内存插槽,linux 查看内存插槽数、最大容量和频率
  5. 计算机系统配置有哪些,电脑配置低装什么系统比较好?(16个回答)
  6. 阿里云服务器配置参数详细说明文档
  7. dns服务器如何修改静态dns条目,静态地址怎么设置dns服务器
  8. 电脑正在锁定计算机是什么意思啊,笔记本正在锁定然后就关机了
  9. RTImageAssets-自动生成iOS 不同分辨率的插件,verygood
  10. 基于QT封装的音视频播放时间轴控件