求 思路:n很大,没有办法暴力去计算.想要比较快速地计算,必须要按照gcd的值进行分类. 我们称
a
n
s
k
ans_k
ansk为
g
c
d
(
i
,
j
)
=
k
的
数
目
gcd(i,j)=k的数目
gcd(i,j)=k的数目.
g
c
d
(
i
,
j
)
=
k
,
g
c
d
(
i
/
k
,
j
/
k
)
=
1.
gcd(i,j)=k,gcd(i/k,j/k)=1.
gcd(i,j)=k,gcd(i/k,j/k)=1. 那么显然
i
,
j
就
是
k
的
若
干
倍
,
令
i
=
a
∗
k
,
j
=
b
∗
k
i,j就是k的若干倍,令i=a*k,j=b*k
i,j就是k的若干倍,令i=a∗k,j=b∗k 那么根据条件,显然有
g
c
d
(
i
/
k
,
j
/
k
)
=
g
c
d
(
a
,
b
)
=
1
;
gcd(i/k,j/k)=gcd(a,b)=1;
gcd(i/k,j/k)=gcd(a,b)=1; 我们需要知道这样的
(
a
,
b
)
的
对
数
,
因
为
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
)
(a,b)的对数,因为gcd(a,b)=gcd(b,a)
(a,b)的对数,因为gcd(a,b)=gcd(b,a) 我们不妨先设
a
>
b
,
然
后
在
统
计
的
时
候
统
一
乘
以
2
即
可
a>b,然后在统计的时候统一乘以2即可
a>b,然后在统计的时候统一乘以2即可 问题变为求这样的
(
a
,
b
)
对
,
其
中
a
>
b
且
g
c
d
(
a
,
b
)
=
1
(a,b)对,其中a>b且gcd(a,b)=1
(a,b)对,其中a>b且gcd(a,b)=1 这是什么,这就是欧拉函数啊,小于n且与n互素的个数. 令小于x且与x互素的数目为
ϕ
(
x
)
\phi(x)
ϕ(x),令
M
=
(
n
/
k
)
M=(n/k)
M=(n/k)
a
n
s
k
=
2
∗
∑
i
=
1
M
ϕ
(
i
)
ans_k=2*\sum_{i=1}^M\phi(i)
ansk=2∗i=1∑Mϕ(i) 请注意,上述式子是假设
a
!
=
b
a!=b
a!=b情况下才成立的. 对于所有的
i
i
i,我们重复计算了
g
c
d
(
i
,
i
)
两
次
,
扣
去
即
可
gcd(i,i)两次,扣去即可
gcd(i,i)两次,扣去即可. 若不会如何写欧拉函数,参考下面个人笔记. https://blog.csdn.net/qq_36018057/article/details/123790815 Ac代码: 爆long long警告.
/*
*/
#include
using namespace std;
typedef long long ll;
const int maxn = 1e5+2;
const int INF = 1e9+7;
#define int long long
typedef pair pii;
int phi[maxn];int sum[maxn];
void phi_table(int n){
for(int i=2;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?