zoukankan      html  css  js  c++  java
  • 圆上的整点

    题目链接:这个咋做?P2508 [HAOI2008]圆上的整点

    看过一次视频:Link

    然而人老了,就忘了,今天复习了一下,记一下,防止再忘一次。

    还有,别问我原理是啥。

    (ps:) 一下说的所有“圆”都指圆心为原点的圆。

    (Part.1)

    质因数分解,每个数都有一个唯一分解式,这是数论的基础。

    [n=prodlimits p_i^{k_i} ]

    我们把实数分解推广到负数系。

    高斯整数:实部与虚部都是整数的负数 ((a+bi,a,bin Z))

    举个栗子:

    [25=(3+4i)(3-4i) ]

    就是对 (25) 在负数系中分解的一种情况。
    对应在坐标平面,半径为 (25) 的圆上就有 ((3,4),(3,-4)) 这两个点。

    如何找到所有的分解呢?

    我们先把圆的半径 (sqrt{n}) 进行实数内的质因数分解。

    我们以 (sqrt{25}=5) 为例。

    [25=5×5 ]

    然后把 (5) 分解。

    分解式要注意同一个素数只用一种分解方法。

    [25=5×5=(1+2i)(1-2i)(1+2i)(1-2i) ]

    这是我们把 (25) 的四个复因子分为两组,并且使得两组中都共轭的一一对应。

    我们假设左面那一组为主导组,主导组不同的就定义为不同的分配方法。

    我们于是乎就有三种分配方法:

    (1.{1+2i,1+2i}&{1-2i,1-2i})
    (2.{1+2i,1-2i}&{1-2i,1+2i})
    (3.{1-2i,1-2i}&{1+2i,1+2i})

    我们可以尝试计算每一种方法中两组的积,所得的负数互为共轭复数。

    比如第一组中两组乘积分解为 (-3+4i,-3-4i)

    这时候,我们发现 ((-3,4))((-3,-4)) 正是半径为 (sqrt{25}) 的圆上的整点坐标。

    不过我们只取主导组中的,因为之后可能会重复计算......

    这时候我们只找到了圆上的三个整点(主导组)。

    但是复数系上的分解不是唯一的。

    比如 (5=(2+i)(2-i),5=(-1+2i)(-1-2i),(-2+i)(-2-i))

    这些都是由其中一对乘上 (-1,i,-i) 而得到的。
    每一组又能得到三个整点,这时候我们就输完了,即半径为 (sqrt{25}) 的圆上有 (4×3=12) 个整点。

    或者说有 (12) 个整数数对 ((a,b)) 满足 (a^2+b^2=25)

    (Part.2)

    当你兴冲冲的去尝试半径为 (sqrt{15}) 的圆上有几个整点时,你发现 (3) 怎么分解啊?

    答案是没法分解。

    这也就意味着并没有分配方式满足两组一一对应共轭,也就是说没有整点在半径为 (sqrt{15}) 的圆上。

    我们再尝试 (sqrt{10}=2×5)

    显然, (2) 的一种分配方解是 ((1+i)(1-i))
    那样会不会增加一种分配方式呢?

    答案是否定的,因为 ((1+i))(1-i) 本身就存在着乘 (i) 的关系,所以将 ((1+i))((1-i)) 换位再乘上 (4) 会增加数目,所以只有和 (5) 分配方式数相同的数目即为 (4)

    这个地方不懂了要手玩啊。

    当然在 (3) 的次数为偶数时,可以将次数的一半分配到两个不同的组,同时调换位置也不能改变最后乘出来的结果,所以答案为剩余部分的方案数。

    也就是说 (sqrt{N}=2^{100}×3^{93}×7) 的整点数为 (0),而 (sqrt{N}=2^{100}×3^{92}×7) 的整点数为 (8) 种。

    经过探究,我们发现(并没有发现,其实是结论)对于一个素数,当他为 (mod 4=3) 的数时,不能分解为两个虚数。

    当他 (mod 4=1) 时,可以分解为不被乘 (-1,i,-i) 干扰的两个虚数。

    当他为 (2) 时,会被干扰,对答案无贡献。

    我们容易发现规律:

    对于一个数 (N) ,把他的质因子分为三组 (S_1,S_2,S_3),分别对应上面那两种情况,最后的答案

    [ans=(prod_{p_iin S_1}1[2|k_i])(prod_{p_i in S_2} (k_i+1))(prod_{p_iin S3}1)=(prod_{p_iin S_1}1[2|k_i])(prod_{p_i in S_2} (k_i+1)) ]

    这玩意已经能 (mathcal O(sqrt{N})) 了。

    核心代码:

    ll ans=1ll;
    ll cnt=0;
    ll lst=0;
    
    ll work(ll n)
    {
    	for(int i=2;1ll*i*i<=n;i++)
    	{
    		if(n%i==0)
    		{
    			if(lst)
    			{
    				if(lst%4==3&&cnt%2==1) return 0;
    				else if(lst%4==1) ans=ans*(cnt+1);
    			}
    			lst=i,cnt=1ll,n/=i;
    			while(n%i==0) cnt++,n/=i; 
    		}
    	}
    	if(lst)
    	{
    		if(lst%4==3&&cnt%2==1) return 0;
    		else if(lst%4==1) ans=ans*(cnt+1);
    	}
    	if(n!=1)
    	{
    		if(n%4==3) return 0;
    		else if(n%4==1) ans*=2;
    	}
    	return ans;
    }
    

    (Part.3)

    能不能更深呢?

    我们记录一个函数 (chi(n))

    定义:

    [chi(x)=egin{cases}1&xmod4=1\-1&xmod 4=3\0&xmod 2=0end{cases} ]

    他是个完全积性函数

    那么:

    [ans=4prodsum_{j=0}^{k_i}chi(p_i^j) ]

    (p_i=2) 的时候后,除了 (chi(2^0)=1),其他都是 (0)
    加起来还是 (1),就没有贡献。

    (p_i=4n+3) 时,次数为偶和为 (1),否则为 (0)
    以后可能会证......

    (p_i=4n+1) 时,为 (k_i+1)

    由于 (p_i^j) 不同的组合得到其所有因数,又因为这个函数是完全积性函数,我们得到:

    [ans=4sumlimits_{d|n} chi(d) ]

    这个东西也是 (mathcal O(sqrt{N})) 的。

    核心代码:

    ll ans=0;
    
    inline int chi(ll x){if(x%2==0) return 0;else return (x%4==1)?1:-1;}
    
    ll work(ll n)
    {
    	for(int i=1;1ll*i*i<=n;i++)
    	{
    		if(n%i==0&&1ll*i*i!=n) ans=ans+1ll*chi(i)+1ll*chi(n/i);
    		else if(n%i==0) ans=ans+1ll*chi(i);
    	}
    	return ans;
    }
    

    这个东西一跑就是上限,所以过不了,只有 (20;pts)

    那么半径为 (sqrt{N}) 的圆中有多少整点呢?

    当然是:

    [4sumlimits_{i=1}^nsum_{d|i}chi(d)+1 ]

    最后加的是圆点,他不过任何一个圆但是在大圆之内。

    按反演的套路化简:

    [egin{aligned} 4sumlimits_{i=1}^nsum_{d|i}chi(d)+1&=4sum_{d=1}^nchi(d)leftlfloordfrac{n}{d} ight floor+1 end{aligned} ]

    由于 (chi(d)) 很有规律,所以这个也可以 (O(sqrt{N})) 算。

    (Part.4)

    我们考虑一个圆中的整点个数大概是:

    [pi R^2 ]

    (n) 够大的时候,我们可以将 (leftlfloordfrac{n}{d} ight floor) 看为 (dfrac{n}{d}),同时 (+1) 可以省去。

    那么:

    [4sumlimits_{i=1}^{n}chi(i)dfrac{n}{i}=pi R^2 ]

    同时这里的 (n) 不就是 (R^2) 吗?
    即:

    [4R^2sumlimits_{i=1}^{R^2}chi(i)dfrac{1}{i}=pi R^2 ]

    我们手玩一下发现后面这个东西不就是:

    [4R^2(dfrac{1}{1}-dfrac{1}{3}+dfrac{1}{5}-dfrac{1}{7}+......) ]

    整理一下得到:

    [sumlimits_{i}^{infty}dfrac{(-1)^{i+1}}{2i-1}=dfrac{pi}{4} ]

  • 相关阅读:
    Visualvm 远程测试 问题
    jsp中文件下载的实现
    MYOB 的一些开发资料
    连接MYOB ODBC,在MyEclipse 下Commit成功,在Tomcat下单独运行,Commit显示Connection 已经关闭
    也说说学习
    objectivec static变量的使用总结
    objective里面的单例模式
    对函数式编程简单理解
    个人技术生涯的感悟(2)
    苹果键盘快捷键图标
  • 原文地址:https://www.cnblogs.com/tlx-blog/p/13202781.html
Copyright © 2011-2022 走看看