题目:

题解:

几何部分,先证明一下 \(KX = \sqrt{a},YL = \sqrt{b}\)

设左侧的圆心为 \(O\) ,连接 \(OK\) ,我们有 \(OK = r\).

然后有 \(r = \frac{a+1}{2},OX = r - a\)

勾股定理有 : \(KX^2 = OK^2 + OX^2\) 解得 : \(KX = \sqrt{a}\).

同理 : \(YL = \sqrt{b}\).

然后我们将 \(YL\) 向左平移直到 \(b\) 与 \(X\) 重合,设此时点 \(L\) 所在处为 \(N\).

那么有 : \(KN^2 + NL^2\) 是整数.

整理可得 : \(\sqrt{ab}\) 是整数.

那么现在的问题就是问有多少有序数对 \((a,b)\) 满足 \(a \in [1,n],b \in [1,m] 且 \sqrt{ab} 是整数\)

对于 \(a\) 这个数字,我们考虑把它拆开 : 令 \(a = a_1^2*a_2\)

其中 \(a_2\) 不含平方因子.

对于 \(b_2\) 同样的拆成 \(b = b_1^2*b_2\)

那么我们发现原来的式子变成了 \(a_1b_1\sqrt{a_2b_2}\)

因为两个不含平方因子的数的乘积变成一个完全平方数,所以易得 \(a_2 = b_2\) , 设为 \(d\).

所以我们可以枚举 \(1\space .. n\) 的 \(d\) ,只要我们保证 \(d\) 不含平方因子即可.

那么对于一个确定的 \(d\) ,由于我们知道 \(d*a_1^2 \leq n\)所以有 \(a_1^2 \leq \lfloor \frac{n}{d}\rfloor\)

那么我们知道对于 \(n\) 以内的完全平方数一共有 \(\lfloor \sqrt{n} \rfloor\) 个。

那么我们就知道对于一个确定的 \(d\) ,有 \(\lfloor \sqrt{\lfloor \frac{n}{d}\rfloor}\rfloor\) 个满足条件的 \(a\)。

那么我们发现计算式实际上就是 :

\[\sum_{i=1}^{min(n,m)}\mu(i)^2 \lfloor \sqrt{\lfloor \frac{n}{d}\rfloor}\rfloor \lfloor \sqrt{\lfloor \frac{m}{d}\rfloor}\rfloor
\]

然后我们考虑如何计算 \(\mu(i)^2\).

我们通过意义来考虑,这实际上就是对是质因子平方倍数的数逐个筛去。

考虑容斥原理,然后用 \(\mu(i)\) 做容斥系数。

我们发现有 : \(\sum_{i=1}^n\mu(i)^2 = \sum_{i=1}^{\sqrt{n}}\mu(i)\lfloor \frac{n}{i^2}\rfloor\)

我们可以提前线性筛出前 \(\sqrt{n}\) 的 \(\mu\) ,然后对于后面的 \(\sum\) 式我们跳块求就好了.

可以证明 : \(\lfloor \frac{n}{i^2} \rfloor\) 的不同值的数目不超过 \(O(n^{\frac{1}{3}})\).

然后计算主计算式的时候后面的两部分也跳块就好了。

常数优越即 \(AC\) ,否则 \(95\).

#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(ll &x){
x=0;static char ch;static bool flag;flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 124000000;
int pri[maxn/10],f[maxn],cnt,sqrn;
short mu[maxn];bool vis[maxn];
inline void liner(int n){
mu[1] = f[1] = 1;
rep(i,2,n){
if(!vis[i]){
pri[++cnt] = i;
mu[i] = -1;
}
rep(j,1,cnt){
ll x = 1LL*i*pri[j];
if(x > n) break;
vis[x] = true;
if(i % pri[j] == 0) break;
mu[x] = -mu[i];
}
f[i] = mu[i]*mu[i];
mu[i] += mu[i-1];
f[i] += f[i-1];
}
}
map<ll,ll>g;
inline ll mu_2(ll n){
if(n <= sqrn) return f[n];
if(g.count(n)) return g[n];
ll res = 0,i = 1;
for(;i*i*i<=n;++i) res += n/(i*i)*(mu[i] - mu[i-1]);
for(ll j,v;i*i <= n;i = j+1){
j = sqrt(n / (v = (n / (i*i))) );
res += (mu[j] - mu[i-1])*v;
}return g[n] = res;
}
int main(){
ll n,m;read(n);read(m);
if(n > m) swap(n,m);
liner(sqrn = sqrt(n));
ll ans = 0,la = 0,tmp;
for(ll i = 1,j,v1,v2;i <= n; i = j+1){
v1 = sqrt(n / i);v2 = sqrt(m / i);
j = min(n / (v1*v1),m / (v2*v2));
ans += ((tmp = mu_2(j)) - la)*v1*v2;
la = tmp;
}printf("%lld\n",ans);
return 0;
}

#510. 「LibreOJ NOI Round #1」动态几何问题的更多相关文章

  1. #509. 「LibreOJ NOI Round #1」动态几何问题

    下面给出部分分做法和满分做法 有一些奇妙的方法可以拿到同样多的分数,本蒟蒻只能介绍几种常见的做法 如果您想拿18分左右,需要了解:质因数分解 如果您想拿30分左右,需要了解:一种较快的筛法 如果您想拿 ...

  2. LOJ 510: 「LibreOJ NOI Round #1」北校门外的回忆

    题目传送门:LOJ #510. 题意简述: 给出一个在 \(K\) 进制下的树状数组,但是它的实现有问题. 形式化地说,令 \(\mathrm{lowbit}(x)\) 为在 \(K\) 进制下的 \ ...

  3. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)

    题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...

  4. 「LibreOJ NOI Round #2」不等关系

    「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...

  5. LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿

    二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...

  6. 「LibreOJ NOI Round #1」验题

    麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然 ...

  7. #507. 「LibreOJ NOI Round #1」接竹竿 dp

    题目: 题解: 我们考虑把每对花色相同的牌看作区间. 那么如果我们设 \(f_i\) 表示决策在 \([1,i]\) 内的最优答案. 那么有 \(f_i = max\{max\{(f_{j-1}+\s ...

  8. 「LibreOJ NOI Round #2」单枪匹马

    嘟嘟嘟 这题没卡带一个\(log\)的,那么就很水了. 然后我因为好长时间没写矩阵优化dp,就只敲了一个暴力分--看来复习还是很关键的啊. 这个函数显然是从后往前递推的,那么令第\(i\)位的分子分母 ...

  9. LOJ575. 「LibreOJ NOI Round #2」不等关系 [容斥,分治FFT]

    LOJ 思路 发现既有大于又有小于比较难办,使用容斥,把大于改成任意减去小于的. 于是最后的串就长成这样:<<?<?<??<<<?<.我们把一段连续的& ...

随机推荐

  1. GPL协议本身就是剥削,oracle维权玩的让人恶心

     我们先来看一下MySQL的版权问题.当前,MySQL采用双重授权(Dual Licensed),他们是GPL和MySQL AB制定的商业许可协议.如果你在一个遵循GPL的自由(开源)项目中使用MyS ...

  2. OpenGL核心技术之Gamma校正

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你/2.2次幂.Gamma校正后的暗红色就会成为(0.5,0.0 ...

  3. php数组元素去空,测试奇数偶数

    <?php//返回奇数 function test_odd($var) { return($var & 1); } $a1=array("a","b&quo ...

  4. Github删除账号方法

    1.登录后点击头像,选择Settings 2.选择Account,然后再选择Delete your account 3.第一个输入框输入邮箱或者用户名,第二个输入框输入delete my accoun ...

  5. scala学习手记17 - 容器和类型推断

    关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...

  6. Samba的安装配置使用

    ////////////////////////////////Samba//////////////////////////////////////////// 小常识:在同一局域网中,两个系统的工 ...

  7. Spark- 使用hiveContext时提交作业报错

    在spark上操作hive时不需要搭建hive环境,只需要从现有的hive集群中hive的conf目录下拷贝 hive-site.xml 到spark的conf目录下即可提交程序运行 出现报错 Cau ...

  8. [Hadoop] - Hadoop 3.x版本新特性

    仅做记录--->官方说明:http://hadoop.apache.org/docs/r3.0.0-alpha2/index.html ============================= ...

  9. 回溯和DFS效率分析

    回溯和DFS效率分析 一.心得 多组数据记得初始化 两组样例,找圆点点的个数 6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# . ...

  10. HYSBZ - 2301 莫比乌斯反演

    链接 题解:直接用公式算,用容斥来减掉重复计算的部分 但是我犯了一个非常sb的错误,直接把abcd除k了,这样算a-1的时候就错了,然后举的例子刚好还没问题= = ,结果wa了好几发 //#pragm ...