喵喵题合集

P3166 [CQOI2014] 数三角形

标签

枚举,容斥,gcd,细节,贡献,莫比乌斯反演,莫反

思路

感觉挺水的,但是没做出来,感觉代码很简单,但是打了好久,细节有点多,还是太菜了。

首先一眼容斥,题目说的不是很清楚啊,可能要猜一下题意。

反正总的三角形(含退化为线段的)个数为 ((n+1)(m+1)3),减去共线的贡献,这个可以考虑枚举线的形态,枚举形状,当前为 (i,j) 点代表 ((0,0),(i,j)) 的线段,线段上有 gcd(i,j)+1 个点,这种形状的线段有 (ni+1)(mj+1) 个,但注意方向,还有横线或竖线的情况特判一下。

ans=((n+1)(m+1)3)(n+1)(m+13)(m+1)(n+13)2i=1nj=1m(ni+1)(mj+1)(gcd(i,j)1

代码

复杂度为 O(nmlogn)=O(n2logn),但可以优化为(递推 gcdO(nm)=O(n2) 但没必要。
code

另一种做法

省流:莫反优化。

考虑优化最后那个东西,考虑快速求出 i=1nj=1m(ni+1)(mj+1)(gcd(i,j)1)

只需快速求出 i=1nj=1m(ni+1)(mj+1)gcd(i,j)

因为有 i=d|iφ(d)

gcd(i,j)=d|gcd(i,j)φ(d)=d|i,d|jφ(d)

即求 i=1nj=1m(ni+1)(mj+1)d|i,d|jφ(d)

即求 d=1min(n,m)φ(d)i=1ndj=1md(nid+1)(mjd+1)

后面的那个 f(d)=i=1nd(nid+1)j=1md(mjd+1)

然后,啊这,这是两个等差数列求和后相乘。

复杂度为 O(n)

但是因为这题的答案是 n6 级别的,long long 最大 263,只能达到 n=1000 左右了。

或者如果用 __int128(2127)16=220,啊这,好像可以。

n=106,个人认为 n=5105 对防止溢出比较友好一点(不然爆 __int128)。

说不定给你出到模拟赛里……

posted @   SkyMaths  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示