背景:
记录一些好的数学题。
理论上持续更。
T1 \text{T1} T1
pro: \text{pro:} pro:
对于一个圆,现在有 n n n个点,两两连边(保证不会多线交一个点),求分成的区域块的数目。
sol: \text{sol:} sol:
视频链接:https://www.bilibili.com/video/av19849697
欧拉定理:在任何一个规则球面地图上,用 R R R记区域个数, V V V记顶点个数, E E E记边界个数,则 R + V − E = 2 R+V-E=2 R+V−E=2。
——摘自《百度百科》
不过,这个公式只适用于边不相交的图,因此,不能够直接套用该公式。
考虑顶点的个数。原来有
n
n
n个点,然后两条边(四个点)会产生一个交点,因此
V
=
n
+
C
n
4
V=n+C_{n}^{4}
V=n+Cn4。
考虑边的个数。一共有
C
n
2
C_{n}^{2}
Cn2条线段交于
C
n
4
C_{n}^{4}
Cn4个点,所以有
C
n
2
+
2
C
n
4
C_{n}^{2}+2C_{n}^{4}
Cn2+2Cn4段,即这么多边。因为你还用
n
n
n个点将圆分开,因此再加上
n
n
n即可。综上,
E
=
C
n
2
+
2
C
n
4
+
n
E=C_{n}^{2}+2C_{n}^{4}+n
E=Cn2+2Cn4+n
带入公式
R
+
V
−
E
=
2
R+V-E=2
R+V−E=2,得到:
R
+
(
n
+
C
n
4
)
−
(
C
n
2
+
2
C
n
4
+
n
)
=
2
R+(n+C_{n}^{4})-(C_{n}^{2}+2C_{n}^{4}+n)=2
R+(n+Cn4)−(Cn2+2Cn4+n)=2
R = C n 2 + C n 4 + 2 R=C_{n}^{2}+C_{n}^{4}+2 R=Cn2+Cn4+2
因为我们只关心圆内的区域数,因此答案减去圆的补集(大小
1
1
1个)。
因此最后的答案为:
R
=
C
n
2
+
C
n
4
+
1
R=C_{n}^{2}+C_{n}^{4}+1
R=Cn2+Cn4+1
T2 \text{T2} T2
que: \text{que:} que:
给定一个圆(
x
2
+
y
2
=
r
2
x^2+y^2=r^2
x2+y2=r2),求在圆周上有多少个点的坐标是整数。
附题目传送门:https://www.luogu.org/problemnew/show/P2508
sol: \text{sol:} sol:
https://www.bilibili.com/video/av12131743/
这个视频太牛逼了。
附上
markdown
\text{markdown}
markdown
χ
\chi
χ的打法:\chi(读作:
/kai/
\text{/kai/}
/kai/)
a n s r 2 = 4 ∑ d ∣ r 2 χ d ans_{r^2}=4\sum_{d|{r^2}}χ_d ansr2=4∑d∣r2χd。
其中对于
χ
χ
χ函数的定义是:
χ
n
=
0
[
n
m
o
d
  
2
=
0
]
\chi_n=0[n \mod 2=0]
χn=0[nmod2=0]
χ
n
=
1
[
n
m
o
d
  
4
=
1
]
\chi_n=1[n \mod 4=1]
χn=1[nmod4=1]
χ
n
=
−
1
[
n
m
o
d
  
4
=
3
]
\chi_n=-1[n \mod 4=3]
χn=−1[nmod4=3]
证明我就不写了,你具体可以看视频。
code: \text{code:} code:
Θ ( r ) \Theta(r) Θ(r):
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define LL long long
using namespace std;
LL r,ans=0;
int main()
{
scanf("%lld",&r);
r*=r;
for(LL i=1;i*i<=r;i++)
if(!(r%i))
{
int chi=i%4==1?1:i%4==3?-1:0;
ans+=chi;
if(i*i!=r) chi=(r/i)%4==1?1:(r/i)%4==3?-1:0,ans+=chi;
}
printf("%lld",ans*4);
}
如果数据范围较大,怎么办呢?
设
r
=
∏
p
i
k
i
r=\prod{p_i}^{k_i}
r=∏piki,
则
r
2
=
∏
p
i
2
k
i
r^2=\prod{p_i}^{2k_i}
r2=∏pi2ki。
根据视频内容,我们知道当
p
i
=
4
n
+
1
(
n
∈
N
+
)
p_i=4n+1(n\in \mathbb{N^+})
pi=4n+1(n∈N+)时,答案会乘上
2
k
i
+
1
2k_i+1
2ki+1;否则不会产生任何贡献(
4
n
+
3
4n+3
4n+3形的也包含在其中,因为
2
n
2n
2n为偶数)。
那不就可以做到
Θ
(
r
)
\Theta(\sqrt{r})
Θ(r)了吗。
Θ
(
r
)
\Theta(\sqrt{r})
Θ(r):
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int r,t=0,ans=1;
bool bz[2000010];
int prime[2000010];
int main()
{
scanf("%d",&r);
bz[0]=bz[1]=true;
int op=sqrt(r);
for(int i=2;i<=op;i++)
{
if(!bz[i]) prime[++t]=i;
for(int j=1;j<=t&&i*prime[j]<=op;j++)
{
bz[i*prime[j]]=true;
if(!i%(prime[j])) break;
}
}
for(int i=1;i<=t;i++)
{
int tot=0;
while(!(r%prime[i])) r/=prime[i],tot++;
if(prime[i]%4==1) ans*=2*tot+1;
if(r==1) break;
}
if(r!=1&&r%4==1) ans*=3;//看看是否存在最后一个质数(>=sqrt(r)z只有一个),不能忘记
printf("%d",ans*4);
}