题解

一道很妙的题,让求对于一个矩阵中,两点相连成线,有多少条直线,他们的交集是有限集。

转化一下题目,发现水平和竖直的只有 \(n+m\) 条,而左斜和右斜的条数是相同的,所以我们只需求出左或右中的即可

这个矩阵中一共有 \(\sum_{a=1}^{n-1}\sum_{b=1}^{m-1}[gcd(a,b)=1]\) 条斜率不同的直线,那么对于每一种斜率,又有 \((n-a)×(m-b)\) 个点

可以伸出来,但是会有重复的所以要减去 \((n-2×a)×(m-2×b)\)

所以最后可以推出来一个总式子

\[\sum_{a=1}^{n-1}\sum_{b=1}^{m-1}[gcd(a,b)=1](n-a)×(m-b)-\max(n-2×a,0)×\max(m-2×b,0)
\]

\(60pts\) 到手

考虑如何优化它,这里提供一种 \(O(n)\) 查询的做法。

我们维护三个数组 \(\gcd\) \(\rm gnm\) \(\rm gsm\),\(\rm gnm_{i,j}\) 表示从 \(1~j\) 有多少个和 \(i\) 互质的数,\(\rm sum\) 表示就是这些数的和。

对于 \(\rm gcd\) 我们可以 \(n^2\) 预处理

查询时,我们枚举 \(a\),对于后边的式子,拆一下

\[(n-a)×m-(n-a)×b-(n-2×a)×m+(n-2×a)×2×b
\]

这个式子,根据我们维护的三个数组就可以求出来了。

Code
#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define int unsigned int
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
typedef long long ll;
static const int N=4e3+7,MOD=(1<<30)-1;
int gsm[N][N],T,ans,n,m;
short num[N][N],*gcd[N];
inline void init() {
ri n=N-7;
// int *(gcd[N])=new int[n+7];
gcd[0]=new short[n+7];
for (ri i(1);i<=n;p(i)) {
gcd[i]=new short[n+7];
gcd[i][i]=gcd[i][0]=gcd[0][i]=i;
// printf("i=%d\n",i);
for (ri j(1);j<i;p(j))
gcd[j][i]=gcd[i][j]=gcd[j][i%j];
}
delete gcd[0];
for (ri i(1);i<=n;p(i)) {
for (ri j(1);j<=n;p(j)) {
if (gcd[i][j]==1) gsm[i][j]=j,num[i][j]=1;
gsm[i][j]+=gsm[i][j-1];
num[i][j]+=num[i][j-1];
}
delete gcd[i];
}
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
init();
read(T);
for (ri z(1);z<=T;p(z)) {
read(n),read(m);ans=0;
ri bs=n*m;
for (ri i(1);i<=n-1;p(i)) {
ans=(ans+(int)num[i][m-1]*(n-i)*m);
ans-=(n-i)*gsm[i][m-1];
if (i*2>=n) continue;
int lm=(m&1)?m/2:m/2-1;
ans-=(n-2*i)*(m*num[i][lm]-(gsm[i][lm]<<1));
}
printf("%u\n",(ans*2+n+m)&MOD);
}
return 0;
}
#undef int
}
int main() {return nanfeng::main();}

小技巧,这个模数很特殊,可以自然溢出,减少低效的取模

NOIP 模拟 $15\; \text{夜莺与玫瑰}$的更多相关文章

  1. NOIP 模拟 $15\; \text{影子}$

    题解 \(by\;zj\varphi\) 一道并查集的题 对于它路径上点权,我们可以转化一下:对于一个点,它在哪些路径上是最小的点权 那么我们排个序,从大到小加入点,每回加入时,将这个点与它所相连的且 ...

  2. NOIP 模拟 $15\; \rm \text{玫瑰花精}$

    题解 \(by\;zj\varphi\) 一道线段树题目 这道题可以通过维护一棵线段树,线段树上的每个节点维护 \(\rm l,r,len,p\) 分别表示这段区间最左边的花精,最右边的花精,被两只花 ...

  3. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  4. 20190725 NOIP模拟8

    今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...

  5. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  6. Noip模拟15 2021.7.14

    T1 夜莺与玫瑰 题目越发的变态起来... 这题刚开始看超级像仪仗队,好不容易码完欧拉函数后尝试×2后输出但不对!! 于是选择了跳过.... 正解居然是莫比乌斯函数....我也是醉了 预处理完就剩下$ ...

  7. noip第15课作业

    1. 累加求和 给定n(1<=n<=100),用递归的方法计算1+2+3+4+5+......+(n-1)+n. 输入:一个大于等于1的整数. 输出:输出一个整数. [样例输入] 5 [样 ...

  8. NOIP模拟

    1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...

  9. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

随机推荐

  1. ArcnLinux安装基础配置(二)

    本文为对此ArchLinux安装使用教程网站中部分内容的总结和扩展补充,想看更详细的内容可以去此网站. 添加一个用户 useradd -m -G wheel -s /bin/bash cirry 设置 ...

  2. Linux文件系统与日志分析

    Linux文件系统与日志分析一.inode与block概述① 文件数据包括元信息(类似文件属性)与实际数据② 文件存储在硬盘上,硬盘最小存储单位是"扇区"(sector),每个扇区 ...

  3. SECURECRT 连接锐捷交换机CONSOLE

    协议选择Serial,端口选择COM1.波特率设置为9600.RTS/CTS要把勾去掉(关闭流控功能)

  4. 电脑通过WIFI连接手机ADB

    1.搜索adb wifi 2.安装并开启:根据提示 3.电脑:adb connect 192.168.1.134 a安装ADB TOOLS b安装ADB DRIVER c将ADB TOOLS复制到c: ...

  5. python mysql 类 图片保存到表中,从表中读图片形成图片文件

    import pymysql class MysqlHelper(object): conn = None def __init__(self, host, username, password, d ...

  6. 视频场景切换检测的FPGA实现

    本文将继续讲述图像处理算法的FPGA实现,后续可能更新图像旋转(1080P).画中画.快速DCT等算法.视频场景切换检测常用于视频编解码领域,我选用的算法是双阈值灰度直方图检测法,起初在MATLAB上 ...

  7. Python开发篇——构建虚拟Python开发环境(Conda+Poetry)

    前言 之前虽略有提及Python,但是没有实际地写点料.惭愧,惭愧,所以这次先起个头,讲讲如何构建虚拟Python开发环境.相信之前看过我博客的人可能会想:博主不会又要聊聊Docker吧?放心,不会. ...

  8. 微信小程序云开发-数据库-用户更新数据并提交

    一.wxml增加input输入框和[更新商品价格]按钮 在商品详情页新增[更新商品价格]按钮,wxml新增部分代码,input绑定事件,用于获取用户输入的内容.按钮绑定事件,用于更新商品价格.  二. ...

  9. PAT乙级:1064 朋友数 (20分)

    PAT乙级:1064 朋友数 (20分) 题干 如果两个整数各位数字的和是一样的,则被称为是"朋友数",而那个公共的和就是它们的"朋友证号".例如 123 和 ...

  10. 深入学习Netty(5)——Netty是如何解决TCP粘包/拆包问题的?

    前言 学习Netty避免不了要去了解TCP粘包/拆包问题,熟悉各个编解码器是如何解决TCP粘包/拆包问题的,同时需要知道TCP粘包/拆包问题是怎么产生的. 在此博文前,可以先学习了解前几篇博文: 深入 ...