数学题集

背景:

记录一些好的数学题。
理论上持续更。

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+VE=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+VE=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=4dr2χ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(nN+)时,答案会乘上 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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值