[loj3069]整点计数
1.基础知识
定义
定义1.1(高斯整数):$\mathbb{Z}[i]=\{a+bi\mid a,b\in Z\}$(其中$i$为虚数单位,即$i^{2}=-1$)
定义1.2(范数):$N(\alpha)=a^{2}+b^{2}$(其中$\alpha=a+bi\in \Z[i]$),显然$N(\alpha)\in N$
定义1.3(基础运算):$+$和$\times$,运算规则与通常的约定相同($\times$可省略)
定理1.1:$N(\alpha\beta)=N(\alpha)N(\beta)$
定义1.4(整环):集合$X$和定义在$X$上的运算$\oplus$和$\otimes$($\otimes$可省略),满足以下条件:
- $\oplus$和$\otimes$满足交换律、结合律和分配律
- 存在零元素$o$,使得$\forall \alpha\in X,o\oplus\alpha=\alpha$
- 存在幺元素$e\ne o$,使得$\forall \alpha\in X,e\alpha=\alpha$
- $\forall \alpha\in X$,满足$\exists \beta\in X,\alpha\oplus\beta=o$
- 若$\alpha\beta=o$,则$\alpha=o$或$\beta=o$
则称$(X,\oplus,\otimes)$构成一个整环
定理1.2:$(\Z[i],+,\times)$构成一个整环
其中零元素$o=0$,幺元素$e=1$(显然两者唯一)
根据第4个条件(显然$\beta$唯一),定义$+$的逆运算$-$,与通常的约定相同
定理1.3:$\forall \alpha\in \Z[i],o\alpha=o$
定理1.4:若$\gamma\ne o$且$\alpha\gamma=\beta\gamma$,则$\alpha=\beta$
定理1.5:$\forall \alpha,\beta\in \mathbb{Z}[i]$且$\alpha\ne o$,$\exists p,r\in \Z[i],\beta=p\alpha+r$且$N(r)\le\frac{N(a)}{2}$
设$\alpha=a+bi$,则$(a+bi)(a-bi)=a^{2}+b^{2}=N(\alpha)$
因此,令$q=\frac{(a-bi)\beta}{N(\alpha)}$,则$q\alpha=\frac{(a+bi)(a-bi)}{N(\alpha)}\beta=\beta$
记$[x]$表示与$x$最接近的整数,显然$|x-[x]|\le \frac{1}{2}$
设$q=a'+b'i$(其中$a',b'\in Q$),取$p=[a']+[b']i\in \mathbb{Z}[i],r=\beta-p\alpha$即可,此时有
$$
N(r)=N(\beta-p\alpha)=N((q-p)\alpha)=((a'-[a'])^{2}+(b'-[b'])^{2})N(a)\le \frac{N(a)}{2}
$$
定义1.5(单位元素):$\epsilon\in \Z[i]$,满足$\exists\alpha\in \Z[i],\epsilon\alpha=e$,并记$\alpha=\epsilon^{-1}$(显然$\alpha$唯一)
定义1.6(单位元素集合):$\varepsilon=\{\epsilon\mid\epsilon$为单位元素$\}$
定理1.6:$\varepsilon=\{\pm1,\pm i\}$
定义1.7(相伴):$\alpha$与$\beta$相伴当且仅当$\exists\epsilon\in \varepsilon,\epsilon \alpha=\beta$,并记作$\alpha\sim \beta$
定理1.7:相伴关系具有对称性、传递性和自反性
整除
定义1.8(整除):$\alpha$整除$\beta$当且仅当$\exists k\in \Z[i],k\alpha=\beta$,并记作$\alpha\mid \beta$
定理1.8:整除具有传递性和自反性
定理1.9:$\alpha\sim \beta$当且仅当$\alpha\mid \beta$且$\beta\mid \alpha$
定义1.9($\alpha$的约数):$\beta\in \Z[i]$,满足$\beta\mid\alpha$
定义1.10($\alpha$的显然约数):$\beta\in \Z[i]$,满足$\beta\in \varepsilon$或$\alpha\sim\beta$
定理1.10:$\alpha$的显然约数为$\alpha$的约数
定义1.11(不可约数):$\xi\in \Z[i]$,满足$\xi\ne o,\xi\notin \varepsilon$且$\xi$的所有约数都为显然约数
定义1.12(素数):$\xi\in \Z[i]$,满足$\xi\ne o,\xi\notin \varepsilon$且$\forall \alpha,\beta\in X,\xi\mid \alpha\beta$当且仅当$\xi\mid\alpha$或$\xi\mid\beta$
定理1.11:素数为不可约数
假设$\xi$为素数但不为不可约数,由于$\xi\ne o,\xi\not\in \varepsilon$,即有约数$\alpha$满足$\alpha\not\in \varepsilon$且$\xi\not\sim\alpha$
记$\xi=\alpha\beta$,则$\alpha,\beta\mid \xi$,考虑$\beta$的性质:
若$\beta\in\varepsilon$,显然$\xi\sim\alpha$,矛盾
若$\xi\sim \beta$,即$\exists\epsilon\in \varepsilon,\xi=\epsilon\beta=\alpha\beta$,由于$\xi\ne o$,必然有$\beta\ne o$,也即$a=\epsilon\in \varepsilon$,矛盾
综上,即$\beta\not\in \varepsilon$且$\xi\not\sim\beta$
事实上,这一段说明:若$\xi\ne o,\xi\not\in \varepsilon$且$\xi$不为不可约数,则$\xi=\alpha\beta$(其中$\alpha,\beta\not\in \varepsilon$且$\xi\not\sim\alpha,\beta$)
同时,根据定理1.8有$\xi\mid\alpha\beta$,也即$\xi\mid\alpha$或$\xi\mid\beta$
由$\alpha,\beta\mid\xi$,即可得到$\xi\sim\alpha$或$\xi\sim\beta$,矛盾
定义1.13($\alpha$和$\beta$的公约数):$d\in \Z[i]$,满足$d\mid\alpha,\beta$
定义1.14($\alpha$和$\beta$的最大公约数):$\alpha$和$\beta$的公约数$d$,满足$\forall \alpha,\beta$的公约数$d',d'\mid d$,并记$d=\gcd(\alpha,\beta)$
分解
定义1.15($\alpha$的分解):若干个不可约数$\xi_{1},\xi_{2},...,\xi_{k}\in \Z[i]$,使得$\alpha=\xi_{1}\xi_{2}...\xi_{k}$
定理1.12:$\forall \alpha\in \Z[i]$且$\alpha\ne o,\alpha\not\in \varepsilon$,$\alpha$存在分解
记$\sigma(\alpha)$为$\alpha$的约数个数(相伴视作相同),对其按照$\sigma(\alpha)$归纳即可,具体如下——
由于$\alpha\ne o$且$\alpha\not\in\varepsilon$,即$\epsilon$和$\alpha$都为$\alpha$的约数且不相伴,也即$\sigma(\alpha)\ge 2$
若$\sigma(\alpha)=2$,显然等价于$a$为不可约数,取$\xi_{i}=\{\alpha\}$即可
若$\sigma(\alpha)<k$时$\alpha$存在分解,考虑$\sigma(\alpha)=k$时(其中$k\ge 3$):
由于$k\ge 3$,显然$\alpha$不为不可约数,且由于$\alpha\ne o,\alpha\not\in \varepsilon$,则$\alpha=\beta\gamma$(其中$\beta,\gamma\not\in \varepsilon$且$\alpha\not\sim\beta,\gamma$)
由于$\beta$的约数都是$\alpha$的约数,但$\alpha$不为$\beta$的约数,即$\sigma(\alpha)>\sigma(\beta)$,同理$\sigma(\alpha)>\sigma(\gamma)$
根据归纳,即$\beta$和$\gamma$存在分解,将两者分解组合即可
同时,$\sigma(\alpha)$显然有限,即得证
命题1.1:不可约数为素数
命题1.2:$\forall \alpha,\beta\in \Z[i],\gcd(\alpha,\beta)$存在,且$\exists x,y\in \Z[i],x\alpha+ y\beta=\gcd(\alpha,\beta)$
命题1.3:$\forall \alpha\in \Z[i]$且$\alpha\ne o,\alpha\not\in\varepsilon$,$\alpha$的分解唯一(不考虑顺序,且若对应项相伴即相同)
定理1.13:命题1.2成立
若$\alpha=\beta=o$,取$\gcd(\alpha,\beta)=o,x=y=o$即可
若$\alpha=o$或$\beta=o$(不妨假设$\alpha=o$且$\beta\ne o$),取$\gcd(\alpha,\beta)=\beta,x=o,y=e$即可
若$\alpha,\beta\ne o$,记$d=\min_{x,y\in \mathbb{Z}[i],x\alpha+y\beta\ne o}x\alpha+y\beta$($\min$指取$N(d)$最小的,若有多个任取即可)
设$d=x_{0}\alpha+y_{0}\beta$,取$\gcd(a,b)=d,x=x_{0},y=y_{0}$即可,证明如下——
取$d'=x_{1}\alpha+y_{1}\beta$且$d'\ne o$,根据定理1.5有$\exists p,r\in \Z[i],d'=pd+r$且$N(r)\le \frac{N(d)}{2}$
由于$r=(x_{1}-px_{0})\alpha+(y_{1}-py_{0})\beta$,若$r\ne o$与$N(d)$最小性矛盾,即$r=o$,也即$d\mid d'$
取$x_{1}=1,y_{1}=0$和$x_{1}=0,y_{1}=1$时,则$d'=\alpha$和$\beta$,即有$d\mid\alpha,\beta$
若$d'$为$\alpha$和$\beta$的公约数,显然$d'\mid d=x_{0}\alpha+y_{0}\beta$
定理1.14:命题1.1,命题1.2和命题1.3两两等价
证明参考《代数数论(第二版)》
由此,即命题1.1和命题1.3也成立
2.功能实现
最大公约数
前面已经说明代数系统$(\mathbb{Z}[i],+,\times)$是唯一分解整环,即最大公约数一定存在
进一步的,我们考虑$\alpha,\beta\in \mathbb{Z}[i]$,如何求$\gcd(\alpha,\beta)$
此时,我们通过辗转相除法计算,假设$\alpha=p\beta+r$(其中$N(r)\le \frac{N(\beta)}{2}$),显然$d\mid\alpha,\beta$和$d\mid \beta,r$是等价的(互相可以推导),因此$\gcd(\alpha,\beta)=\gcd(\beta,r)$,递归下去即可
结束条件为$\beta=o$,此时取$\gcd(\alpha,\beta)=\alpha$显然满足条件($o$整除任何数)
同时由于$N(r)\le \frac{N(\beta)}{2}$,时间复杂度为$o(\log N(\alpha)+N(\beta))$
定理2.1:$\forall \alpha,\beta\in \mathbb{Z}[i]$且$x,y\ne o$,$N(\gcd(\alpha,\beta))=\min_{x,y\in \mathbb{Z}[i],x\alpha+y\beta\ne o}N(x\alpha+y\beta)$
证明参考定理1.13的证明
素数判定
(由于是唯一分解整环,不可约数以下一律称为素数)
为了方便,以下称整数意义下的素数为质数,其中模4余3的质数称为$4k+3$质数,其余的称为非$4k+3$质数(显然只能为2或模4余1)
定理2.2:对于非$4k+3$质数$p$,$\exists x\in Z^{+},p\mid x^{2}+1$
若$p=2$,取$x=1$即可
若$p\equiv 1(mod\ 4)$,则$\prod_{i=1}^{\frac{p-1}{2}}(p-i)\equiv (-1)^{\frac{p-1}{2}}(\frac{p-1}{2}!)=(\frac{p-1}{2}!)(mod\ p)$
取$x=\frac{p-1}{2}!$,即有$x^{2}\equiv (p-1)!\equiv -1(mod\ p)$(威尔逊定理),也即$p\mid x^{2}+1$
考虑$\xi\in \Z[i]$,如何快速判定$\xi$是否是素数
定理2.3:$\xi$为素数当且仅当$N(\xi)$为非$4k+3$质数或$N(\xi)=p^{2}$(其中$p$为$4k+3$质数)
- 充分性
若$\xi$不为素数,若$\xi=o,\xi\in\varepsilon$即$N(\xi)=0$或1,显然不为上述形式
否则,设$\xi=\alpha\beta$(其中$\alpha,\beta\notin \varepsilon$且$\xi\not\sim\alpha,\beta$),也即有$N(\alpha),N(\beta)\ne 1$且$N(\xi)=N(\alpha)N(\beta)$
若$N(\xi)$为(非$4k+3$)质数,那么$N(\alpha)$和$N(\beta)$中必然有一个1,矛盾
若$N(\xi)=p^{2}$(其中$p$为$4k+3$质数),由于$N(\alpha),N(\beta)\ne 1$,必然是$N(\alpha)=N(\beta)=p$
设$\alpha=a+bi$,则$N(\alpha)=a^{2}+b^{2}=p\equiv 3(mod\ 4)$,而$a^{2},b^{2}\equiv 0,1(mod\ 4)$,显然不存在
- 必要性
设素数$\xi=a+bi$,则$(a+bi)(a-bi)=N(\xi)$,也即$\xi=a+bi\mid N(\xi)$
对$N(\xi)$质因数分解,记$N(\xi)=p_{1}p_{2}...p_{k}$(其中$p_{i}$为质数),根据$\xi$为素数即$\exists 1\le i\le k,\xi\mid p_{i}$
不妨假设$\xi\mid p=p_{i}$,即$N(\xi)\mid N(p)=p^{2}$,同时$p\mid N(\xi)$
若$N(\xi)=p$,上面已经说明$N(\xi)$不能为$4k+3$质数,即$N(\xi)$为非$4k+3$质数
若$N(\xi)=p^{2}$,假设$p$为非$4k+3$质数:
根据定理2.2有$\exists x\in Z^{+},p\mid x^{2}+1=(x+i)(x-i)$
显然$p\not\mid x\pm i$,即$p$不为素数,显然$\xi\sim p$也不为素数,矛盾
因此$p$为$4k+3$质数,即得证
分解
下面,考虑来分解一个$\alpha\in \Z[i]$且$\alpha\not\ne o,\alpha\not\in \varepsilon$——
先对$N(\alpha)$质因数分解,假设$N(\alpha)=\prod_{i=1}^{k}p_{i}^{a_{i}}$(其中$p_{i}$为质数,且$p_{i}$各不相同)
设分解为$\alpha=\prod_{i=1}^{s}\xi_{i}$,根据前面的素数判定,则$N(\xi_{i})$的形式是确定的——
1.$\forall 1\le i\le k$且$p_{i}$为非$4k+3$质数恰有$a_{i}$个$N(\xi)=p_{i}$
2.$\forall 1\le i\le k$且$p_{i}$为$4k+3$质数,恰有$\frac{a_{i}}{2}$个$N(\xi)=p_{i}^{2}$(这里$a_{i}$一定为偶数)
由此,$\forall 1\le i\le s,N(\xi_{i})$已经确定,不妨枚举所有$\xi$使得$N(\xi)=N(\xi_{i})$且$\xi\mid\alpha$,然后将其除掉,重复此过程即可得到最终的分解
暴力枚举时间复杂度为$o(\sqrt {N(\alpha)})$,并不足够优秀
但事实上,解的数量并不多,即有以下结论——
定理2.4:对于素数$\xi$,方程$a^{2}+b^{2}=N(\xi)$的整数解存在且唯一(不考虑顺序和符号下)
- 存在性
若$N(\xi)=p^{2}$(其中$p$其$4k+3$质数),取$\xi=p$即可
若$N(\xi)=p$(其中$p$为非$4k+3$质数),设$p$在$\Z[i]$中分解为$\prod_{i=1}^{k}\xi_{i}$,则$p^{2}=\prod_{i=1}^{k}N(\xi_{i})$
由于$\xi_{i}$都是素数,则$N(\xi_{i})\neq 1,p^{2}$,那么必然是$k=2$且$N(\xi_{1})=N(\xi_{2})=p$
设$\xi_{1}=a+bi$,即$N(\xi_{1})=a^{2}+b^{2}=p$
- 唯一性
若有两组解$(a,b)$和$(c,d)$,即$N(\xi)=a^{2}+b^{2}=c^{2}+d^{2}$(且$a,b,c,d\in Z$)
由于$a^{2}+b^{2}=(a+bi)(a-bi)$,即$a+bi\mid c^{2}+d^{2}=(c+di)(c-di)$
由于$N(a+bi)=N(\xi)$,显然$a+bi$在$(\Z[i],+,\times)$中为素数,即$a+bi\mid c+di$或$a+bi\mid c-di$
不妨假设$a+bi\mid c+di$,设$c+di=\epsilon(a+bi)$,由于$N(a+bi)=N(c+di)$,即$N(\epsilon)=1$,也即$\epsilon\in \varepsilon$,分类讨论即可得到$(a,b)$和$(c,d)$在不考虑顺序和符号下相同
由于$\xi=a+bi$是考虑顺序和符号的,也即至多只有8组,那么只需要找到一组解,即可$o(1)$枚举所有解
若$N(\xi)=p^{2}$(其中$p$为$4k+3$质数),取$\xi=p$即可
若$N(\xi)=p$(其中$p$为非$4k+3$质数),有以下结论——
定理2.5:若$p$为非$4k+3$质数,$z\in Z$满足$z^{2}\equiv -1(mod\ p)$,则$N(\gcd(p,z+i))=p$
根据定理2.4,有$\exists a,b,a^{2}+b^{2}=p$,即$a^{2}+b^{2}\equiv a^{2}-z^{2}b^{2}=(a-zb)(a+zb)\equiv 0(mod\ p)$
由于$p$为质数,即$p\mid a-zb$或$p\mid a+zb$
不妨假设$p\mid a-zb$,设$a-zb=kp$,即$a+bi=(kp+zb)+bi=kp+b(z+i)$
记$d=\gcd(p,z+i)$,显然$d\mid a+bi$,即$N(d)\mid N(a+bi)=p$
同时,由于$a+bi\mid (a+bi)(a-bi)=p$,即$a+bi\mid b(z+i)$
由于$N(a+bi)=p$,即$a+bi$为素数,显然$a+bi\not\mid b$,也即$a+bi\mid z+i$
由于$a+bi\mid p,z+i$,即$a+bi\mid d$,也即$N(a+bi)=p\mid N(d)$
综上,即$N(d)=p$
由此,取$\xi=\gcd(p,z+i)$即可
关于如何求$z$,对$p$分类讨论——
当$p=2$时,显然$z=1$即可
当$p\equiv 1(mod\ 4)$时,由于$(-1)^{\frac{p-1}{2}}\equiv 1(mod\ p)$,即$-1$是模$p$的二次剩余,那么$z$是存在的
关于$z$的具体求法,不断随机$1\le c<p$使得$c^{\frac{p-1}{2}}\equiv -1(mod\ p)$,那么取$z\equiv c^{\frac{p-1}{4}}(mod\ p)$即可
关于随机的复杂度,有以下结论——
定理2.6:在$1\le c<p$中,满足$c^{\frac{p-1}{2}}\equiv -1(mod\ p)$的$c$存在$\frac{p-1}{2}$个
根据费马小定理,有$c^{p-1}\equiv 1(mod\ p)$,即$c^{\frac{p-1}{2}}\equiv \pm1(mod\ p)$
根据欧拉准则,有$c$为模$p$的非二次剩余当且仅当$c^{\frac{p-1}{2}}\equiv -1(mod\ p)$
由于$x^{2}\equiv (p-x)^{2}(mod\ p)$,因此至多只有$\frac{p-1}{2}$个数为二次剩余,也即得证
因此,期望时间复杂度为$o(1)$
综上,这一部分复杂度为$o(\log^{2}N(\alpha))$(对每一个素因子,需要快速幂和求$\gcd$)
由于初始需要对$N(\alpha)$分解,使用Pollard-Rho算法,时间复杂度为$o(N(\alpha)^{\frac{1}{4}})$
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 struct Num{
5 ll x,y;
6 Num(){
7 x=y=0;
8 }
9 Num(ll xx,ll yy){
10 x=xx,y=yy;
11 }
12 ll len(){
13 return x*x+y*y;
14 }
15 Num conj(){
16 return Num(x,-y);
17 }
18 Num operator - ()const{
19 return Num(-x,-y);
20 }
21 Num operator + (const Num &k)const{
22 return Num(x+k.x,y+k.y);
23 }
24 Num operator * (const Num &k)const{
25 return Num(x*k.x-y*k.y,x*k.y+y*k.x);
26 }
27 };
28 int p[5]={3,5,7,11,13};
29 vector<ll>v;
30 vector<Num>ans;
31 ll mul(ll x,ll y,ll n){
32 return (__int128)x*y%n;
33 }
34 ll gcd(ll x,ll y){
35 if (!y)return x;
36 return gcd(y,x%y);
37 }
38 ll qpow(ll n,ll m,ll mod){
39 ll s=n,ans=1;
40 while (m){
41 if (m&1)ans=mul(ans,s,mod);
42 s=mul(s,s,mod);
43 m>>=1;
44 }
45 return ans;
46 }
47 ll get_min(ll x,ll y){
48 ll ans=(2*abs(x)/abs(y)+1)/2;
49 if ((x<0)^(y<0))ans=-ans;
50 return ans;
51 }
52 bool check(ll n){
53 if (n==2)return 1;
54 if (n%2==0)return 0;
55 ll m=n-1,k=0;
56 while (m%2==0){
57 k++;
58 m/=2;
59 }
60 for(int i=0;i<5;i++){
61 if (n%p[i]==0)return n==p[i];
62 ll s=qpow(p[i],m,n);
63 for(int j=0;j<k;j++){
64 if ((mul(s,s,n)==1)&&(s!=1)&&(s!=n-1))return 0;
65 s=mul(s,s,n);
66 }
67 if (s>1)return 0;
68 }
69 return 1;
70 }
71 ll get_fac(ll n){
72 ll x=rand()%n,c=rand()%n,y=(mul(x,x,n)+c)%n,z=1,tot=0;
73 while (1){
74 if ((x==y)||(tot%100==0)){
75 if (gcd(z,n)>1)return gcd(z,n);
76 if (x==y)return 1;
77 z=1;
78 }
79 tot++;
80 z=mul(z,(x+n-y)%n,n);
81 if (!z)return gcd((x+n-y)%n,n);
82 x=(mul(x,x,n)+c)%n;
83 y=(mul(y,y,n)+c)%n;
84 y=(mul(y,y,n)+c)%n;
85 }
86 }
87 void decompose(ll n){
88 if (check(n)){
89 v.push_back(n);
90 return;
91 }
92 while (1){
93 ll p=get_fac(n);
94 if (p>1){
95 decompose(p);
96 decompose(n/p);
97 return;
98 }
99 }
100 }
101 pair<Num,Num> divide(Num x,Num y){//若n较大,这里需要使用__int128
102 Num ans=y.conj()*x;
103 ans.x=get_min(ans.x,y.len());
104 ans.y=get_min(ans.y,y.len());
105 return make_pair(ans,x+(-ans*y));
106 }
107 Num gcd(Num x,Num y){
108 if (!y.len())return x;
109 return gcd(y,divide(x,y).second);
110 }
111 Num get_Num(ll k){
112 if (k==2)return Num(1,1);
113 while (1){
114 ll c=rand()%k;
115 if (qpow(c,(k-1)/2,k)==k-1){
116 ll z=qpow(c,(k-1)/4,k);
117 return gcd(Num(k,0),Num(z,1));
118 }
119 }
120 }
121 vector<Num> decompose(Num k){
122 v.clear();
123 decompose(k.len());
124 sort(v.begin(),v.end());
125 vector<Num>ans;
126 ans.clear();
127 for(int i=0,flag=0;i<v.size();i++){
128 if (v[i]%4==3){
129 if (flag){
130 Num p=Num(v[i],0);
131 k=divide(k,p).first;
132 ans.push_back(p);
133 }
134 flag^=1;
135 }
136 else{
137 Num p=get_Num(v[i]);
138 pair<Num,Num>o=divide(k,p);
139 if (o.second.len()){
140 p=p.conj();
141 o=divide(k,p);
142 }
143 k=o.first;
144 ans.push_back(p);
145 }
146 }
147 ans[0]=ans[0]*k;
148 return ans;
149 }
150 int main(){
151 srand(time(0));
152 }
3.题目
题面
记$f(x)=\sum_{\alpha\in \mathbb{Z}[i],N(\alpha)=x^{2}}1$,求$\sum_{i=1}^{N}f(i)^{K}$,答案对$P$取模
$1\le N,K\le 10^{11}$,$10^{8}\le P\le 10^{9}+7$
Subtask1:$N\le 8\times 10^{3}$
Subtask2:$K\ge 15$,$P$为2的幂次
Subtask3:$N\le 2\times 10^{7}$
Subtask4:$N\le 2\times 10^{8}$,$1\le K\le 2$
Subtask5:无特殊限制
Subtask1
关于$f(x)$,我们分别枚举$a$的实部和虚部,也即$\sum_{a,b\in Z,a^{2}+b^{2}=x^{2}}1$
显然$|a|,|b|\le x$,在$[-x,x]$中暴力枚举即可,复杂度为$o(N^{3})$
显然,只需要枚举$a$并判定$b$即可,因此不需要枚举$b$
时间复杂度为$o(N^{2})$,可以通过
Subtask2
定义$g(x)=\sum_{a,b\in Z^{+},a^{2}+b^{2}=x^{2}}1$,显然$f(x)=4g(x)+4$
由于$g(x)\in Z$,因此$4\mid f(x)$,即$2^{2K}\mid f(x)^{K}$,因此$f(x)^{K}\equiv 0(mod\ P)$,答案即为0
时间复杂度为$o(1)$,可以通过
Subtask3
定义3.1(勾股数):$(a,b,c)$,满足$a,b,c\in Z^{+}$且$a^{2}+b^{2}=c^{2}$
关于$g(x)$,即求形如$(a,b,x)$的勾股数对数
定理3.1:若$(a,b,c)$为勾股数,则$\gcd(a,b)=\gcd(a,c)=\gcd(b,c)$
定义3.2(原生勾股数):勾股数$(a,b,c)$,满足$\gcd(a,b)=1$
显然,每一对勾股数$(a,b,c)$都恰存在一对原生勾股数$(\frac{a}{d},\frac{b}{d},\frac{c}{d})$(其中$d=\gcd(a,b)$)
考虑一个整数二元组$(n,m)$,满足$n>m>0,n+m\equiv 1(mod\ 2)$且$\gcd(n,m)=1$,以此构造出以下两对勾股数:$(2nm,n^{2}-m^{2},n^{2}+m^{2})$和$(n^{2}-m^{2},2nm,n^{2}+m^{2})$
定理3.2:由此构造出的勾股数都是原生勾股数,且不重复
记$d=\gcd(2nm,n^{2}-m^{2})=\gcd(2nm,(n+m)(n-m))$,显然左边三项与右边两项两两互素,即$d=1$,也即为原生勾股数
由于$2nm$为偶数且$n^{2}-m^{2}$为奇数,显然两类之间显然不会重复
若$(n_{1},m_{1})$和$(n_{2},m_{2})$所产生的相同,由于是同一类,显然两数的平方和和平方差相同,即两数相同
定理3.3:每一对原生勾股数$(a,b,c)$,都存在一组$(n,m)$构造得到
若$a$和$b$同为偶数,即$\gcd(a,b)\ge 2$,矛盾
若$a$和$b$同为奇数,即$c^{2}\equiv a^{2}+b^{2}\equiv 2(mod\ 4)$,矛盾
不妨假设$a$为偶数且$b$为奇数,即$c^{2}\equiv a^{2}+b^{2}\equiv 1(mod\ 4)$,显然$c$为奇数
设$a=2k$,即$c^{2}-b^{2}=(c-b)(c+b)=4k^{2}$,也即$\frac{c-b}{2}\frac{c+b}{2}=k^{2}$,显然$\frac{c-b}{2},\frac{c+b}{2}\in Z$
记$x=\frac{c-b}{2},y=\frac{c+b}{2},d=\gcd(x,y)$,即$d\mid b=y-x,c=x+y$,也即$\gcd(a,b)=\gcd(b,c)\ge d$,显然$d=1$,即$x$和$y$互素
由于$xy=k^{2}$,即$x$和$y$都为完全平方数,显然取$m=\sqrt{x},n=\sqrt{y}$即可
综上,我们只需要枚举$(n,m)$来得到所有原生勾股数,并再枚举$d$得到所有勾股数
由于$n^{2}+m^{2}=c\le N$,因此$n$和$m$的范围都是$o(\sqrt{N})$的,这一部分复杂度为$o(N)$
关于$d$的枚举,总复杂度恰为勾股数的对数,也即$\sum_{i=1}^{N}g(i)$,约为$10^{8}$
最后,再$o(N\log K)$求出$\sum_{i=1}^{N}(4g(i)+4)^{K}$即可
时间复杂度为$o(\sum_{i=1}^{N}g(i)+N\log K)$,可以通过
Subtask4
考虑从$(\mathbb{Z}[i],+,\times)$的角度来求$f(x)$,问题即求$N(\alpha)=x^{2}$的数字个数
记$g(x)$为满足$N(\alpha)=x^{2}$的$\alpha$的个数(相伴视作相同),显然其中每一个数都可以乘上$\varepsilon$中的数得到4个结果,即$f(x)=4g(x)$,也即$\sum_{i=1}^{N}f(i)^{K}=4^{K}\sum_{i=1}^{n}g(i)^{K}$,不妨仅考虑$\sum_{i=1}^{n}g(i)^{K}$
由于$N(\alpha)$是确定的,$\alpha$的分解$\xi_{1},\xi_{2},...,\xi_{k}$中$N(\xi_{i})$的形式是确定的
显然对于$\alpha,\beta\in \Z[i]$满足$N(\alpha)=N(\beta)=x^{2}$,$\alpha$和$\beta$相伴当且仅当两者的分解相同(不考虑顺序,且若对应项相伴即相同)
换言之,统计$g(x)$可以改为统计有多少种分解方式,且由于$N(\xi_{i})$的形式是确定的,只需要分别统计每一项的方案数即可
根据定理2.4,若$N(\xi_{i})=a^{2}+b^{2}$,解$\xi=\pm a\pm bi$或$\pm b\pm ai$
若$p_{i}=2$或$p_{i}$为$4k+3$质数,先仍然这些解都相伴,因此没有贡献
当$p_{i}\equiv 1(mod\ 4)$时,恰有两种解(不相伴),且由于仅关心与两种解的个数,显然为$a_{i}+1$种
综上,记$x$的质因数分解的结果为$\prod_{i=1}^{k}p_{i}^{a_{i}}$,则$g(x)=\prod_{1\le i\le k,p_{i}\equiv 1(mod\ 4)}(2a_{i}+1)$
预处理$o(N)$筛出每一个数的最小素因子,即可$o(\log x)$求出$x$质因数分解的结果,也即可求出$g(x)$
由于每一个$g(x)$都是独立计算的,且$K$只有两种,通过分块打表优化即可
最后,再$o(N)$求和即可($1\le K\le 2$)
时间复杂度为$o(N+\alpha \log N)$(其中$\alpha$为打表的间隔,取$4\times 10^{5}$即可)
Subtask5
根据$g(x)$的式子,不难得到$g(x)$是积性函数,那么显然$h(x)=g(x)^{K}$也是积性函数
问题即求$h(x)$这个积性函数的前缀和,下面考虑用类似Min25筛的做法——
记素数从小到大依次为$p_{1},p_{2},...$,$\pi_{n}$表示不超过$n$的素数个数,$\min_{n}$为$n$最小的素因子
定义$S=\{i\mid i\le \sqrt{N}\or i=\lfloor\frac{N}{x}\rfloor\}$,$S_{1}(n)=\sum_{p_{i}\le n}h(p_{i})$,$S_{2}(n,m)=\sum_{2\le i\le n,p_{m}<\min_{i}}h(i)$
问题即求$1+S_{2}(N,0)$,有如下转移——
$$
S_{2}(n,m)=\sum_{p_{m}<p_{i}\le \sqrt{n},e\ge 1,p_{i}^{e}\le n}h(p_{i}^{e})(1+S_{2}(\lfloor\frac{n}{p_{i}^{e}}\rfloor,i))+(S_{1}(n)-S_{1}(\max(p_{m},\sqrt{n})))
$$
考虑递归计算$S_{2}(N,0)$,在$\sqrt{n}<p_{m}$时,前者即为0,直接返回后者即可,因此需要继续递归的状态$(n,m)$都满足$n\in S$且$m\le \pi_{\sqrt{n}}$
接下来,考虑$\forall n\in S$预处理出$S_{1}(n)$,即$\sum_{1\le i\le n,i为素数,i\equiv 1(mod\ 4)}1$
定义$S_{r}(n,m)=\sum_{2\le i\le n,i为素数或p_{m}<\min_{i},i\equiv r(mod\ 4)}1$(其中$r\in \{1,3\}$),注意到若$i$不为素数,总有小于等于$\sqrt{N}$的素因子,因此有$S_{1}(n)=3^{K}S_{1}(n,\pi_{\sqrt{n}})+(S_{3}(n,\pi_{\sqrt{n}})+[n\ge 2])$
初始即$S_{r}(n,0)=\begin{cases}\lfloor\frac{n-1}{4}\rfloor&(r=1)\\\lfloor\frac{n+1}{4}\rfloor&(r=3)\end{cases}$,转移考虑从$S_{r}(n,m-1)$转移到$S_{r}(n,m)$,即要删去$\min_{i}=p_{m}$的部分,考虑对$p_{m}$分类讨论——
1.$p_{m}=2$,若$\min_{i}=2$显然$i\not\equiv r(mod\ 4)$,即$S_{r}(n,m)=S_{r}(n,m-1)$
2.$p_{m}\equiv 1(mod\ 4)$,则$S_{r}(n,m)=S_{r}(n,m-1)-(S_{r}(\lfloor\frac{n}{p_{m}}\rfloor,m-1)-S_{r}(p_{m}-1,m-1))$
3.$p_{m}\equiv 3(mod\ 4)$,则$S_{r}(n,m)=S_{r}(n,m-1)-(S_{r\oplus 2}(\lfloor\frac{n}{p_{m}}\rfloor,m-1)-S_{r\oplus 2}(p_{m}-1,m-1))$
关于这两个转移,考虑将$\min_{i}=p_{m}$的$i$除以$p_{m}$,此时范围即$\lfloor\frac{n}{p_{m}}\rfloor$,但根据定义,$S_{r}(\lfloor\frac{n}{p_{m}}\rfloor,m-1)$中还包含素数,后者即去掉这一部分
关于模4的余数,显然乘1后不变、乘3后恰好改变,即该式子
时间复杂度为$o(\frac{N^{\frac{3}{4}}}{\log N})$,可以通过
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define ll long long
5 int K,mod,vis[N],P[N],mi[N],h[2][N<<1],H[N<<1];
6 ll n,k;
7 int qpow(int n,ll m){
8 int s=n,ans=1;
9 while (m){
10 if (m&1)ans=1LL*ans*s%mod;
11 s=1LL*s*s%mod;
12 m>>=1;
13 }
14 return ans;
15 }
16 int id(ll k){
17 if (k<=K)return k;
18 return 2*K+1-n/k;
19 }
20 ll get(int k){
21 if (k<=K)return k;
22 return n/(2*K+1-k);
23 }
24 ll sqr(int k){
25 return 1LL*k*k;
26 }
27 int dfs(ll n,int m){
28 if (m){
29 if (n<P[m])return 0;
30 if (n<sqr(P[m]))return (H[id(n)]-H[id(P[m])]+mod)%mod;
31 }
32 int ans=(H[id(n)]-H[id((int)sqrt(n))]+mod)%mod;
33 for(int i=m+1;(i<=P[0])&&(sqr(P[i])<=n);i++){
34 ll s=P[i];
35 for(int e=1;s<=n;e++,s*=P[i]){
36 if (P[i]%4!=1)ans=(ans+(1+dfs(n/s,i)))%mod;
37 else ans=(ans+1LL*mi[2*e+1]*(1+dfs(n/s,i)))%mod;
38 }
39 }
40 return ans;
41 }
42 int main(){
43 for(int i=2;i<N;i++){
44 if (!vis[i])P[++P[0]]=i;
45 for(int j=1;(j<=P[0])&&(i*P[j]<N);j++){
46 vis[i*P[j]]=1;
47 if (i%P[j]==0)break;
48 }
49 }
50 scanf("%lld%lld%d",&n,&k,&mod);
51 for(int i=1;i<N;i++)mi[i]=qpow(i,k);
52 K=(int)sqrt(n);
53 for(int i=1;i<=2*K;i++){
54 h[0][i]=(get(i)-1)/4%mod;
55 h[1][i]=(get(i)+1)/4%mod;
56 }
57 for(int i=1;P[i]<=K;i++){
58 if (P[i]==2)continue;
59 int pp=(P[i]%4==3);
60 for(int j=2*K;(j)&&(sqr(P[i])<=get(j));j--)
61 for(int p=0;p<2;p++)h[p][j]=(h[p][j]-(h[p^pp][id(get(j)/P[i])]-h[p^pp][id(P[i]-1)]+mod)%mod+mod)%mod;
62 }
63 for(int i=1;i<=2*K;i++)H[i]=(1LL*mi[3]*h[0][i]+h[1][i]+(get(i)>=2))%mod;
64 printf("%lld",1LL*mi[4]*(1+dfs(n,0))%mod);
65 }
拓展
定义$f'(x)=\sum_{a\in \mathbb{Z}[i],N(a)=x}1$,考虑如何求$f'(x)$,类似地有以下结论——
将$x$质因数分解,设为$\prod_{i=1}^{k}p_{i}^{a_{i}}$,若$\exists 1\le i\le k,p_{i}\equiv 3(mod\ 4)$且$a_{i}\equiv 1(mod\ 2)$,则答案为0,否则答案与之前相同,即$f'(x)=4\prod_{1\le i\le k,p_{i}\equiv 1(mod\ 4)}(a_{i}+1)$
构造$\chi(x)=\begin{cases}1&x\equiv 1(mod\ 4)\\-1&x\equiv -1(mod\ 4)\\0&x\equiv 0(mod\ 2)\end{cases}$,每一个$p_{i}^{a_{i}}$对答案的贡献,都可以表示为$\sum_{j=0}^{a_{i}}\chi(p_{i}^{j})$(具体验证可分类讨论,这里就省略了)
换言之,即$f'(x)=4\prod_{i=1}^{k}\sum_{j=1}^{a_{i}}\chi(p_{i}^{j})$
考虑$\chi(x)$,不难证明其为(完全)积性函数,将后者展开,即有$f'(x)=4\sum_{d\mid x}\chi(d)$
(另外,当$x=0$时其不满足此式子,此时显然$f'(x)=1$)
考虑这样一个问题:求以$(0,0)$为圆心、$R$为半径的圆内整点数($R\in Z^{+}$)
显然,答案即$\sum_{i=0}^{R^{2}}f'(i)=1+4\sum_{i=1}^{R^{2}}\sum_{j\mid i}\chi(j)=1+4\sum_{i=1}^{R^{2}}\lfloor\frac{R^{2}}{i}\rfloor\chi(i)$
另一方面,每一个整点可以看作“几乎”对应于一个$1\times 1$的小方格,因此可以认为整点数与圆的面积接近,即得到式子$\pi R^{2}\approx 1+4\sum_{i=1}^{R^{2}}\lfloor\frac{R^{2}}{i}\rfloor\chi(i)$
再进一步的估计,即有$\pi\approx 4\sum_{i=1}^{R^{2}}\frac{\chi(i)}{i}=4(1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}...)$
(虽然之前的描述并不严谨,但事实上这是正确的)
[loj3069]整点计数的更多相关文章
- 2019国家集训队论文《整点计数》命题报告 学习笔记/Min25
\(2019\)国家集训队论文<整点计数>命题报告 学习笔记/\(Min25\) 补了个大坑 看了看提交记录,发现\(hz\)的\(xdm\)早过了... 前置知识,\(HAOI\)< ...
- LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)
题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...
- 计数排序(counting-sort)——算法导论(9)
1. 比较排序算法的下界 (1) 比较排序 到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序n个数的算法:归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界. ...
- Objective-C内存管理之引用计数
初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...
- 最小生成树计数 bzoj 1016
最小生成树计数 (1s 128M) award [问题描述] 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- [LeetCode] Count and Say 计数和读法
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- C++ 引用计数技术及智能指针的简单实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...
- BZOJ 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3621 Solved: 1605[Submit][Sta ...
随机推荐
- 浅谈一手MYSQL设计规范
前言: 最近牵头搞一个机场管理集团的项目,发现团队中的成员对于库表设计,有非常多的盲区.所以决定写一篇文章,总结一下最近工作的几年中,常用的一些数据库设计规范和思路. 目的 MySQL数据库与 Ora ...
- js 面向对象 动态添加标签
有点逻辑 上代码 thml布局 点击查看代码 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 4.14——208. 实现 Trie (前缀树)
前缀树(字典树)是经典的数据结构,以下图所示: 本来处理每个节点的子节点集合需要用到set,但是因为输入规定了只有26个小写字母,可以直接用一个[26]的数组来存储. 关于ASCII代码: Java ...
- 使用Servlet前Tomcat介绍
虚拟目录的映射方式:让tomcat服务器自动映射tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚似目录.换句话说,tomcat服务器webapps目录中的web应用,外 ...
- 什么是产品待办列表?(What is Product Backlog)
正如scrum指南中所描述的,产品待办事项列表是一个紧急而有序的列表,其中列出了改进产品所需的内容.它是scrum团队承担的工作的唯一来源. 在sprint计划 (Sprint Planning)活动 ...
- 【好好编程-技术博客】微信小程序开发中前后端的交互
微信小程序开发中前后端的交互 微信小程序的开发有点类似与普通网页的开发,但是也不尽然相同.小程序的主要开发语言是JavaScript,开发同普通的网页开发有很大的相似性,对于前端开发者而言,从网页开发 ...
- 2020BUAA软工个人博客作业-软件案例分析
2020BUAA软工个人博客作业-软件案例分析 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分 ...
- 修改git仓库的远程地址
在我们开发的过程中,代码一般是由 git 来管理的,但有些时候我们的 git 仓库的地址可能发生了变换,比如我们使用的 gitLab 地址发生了变化,那么这个时候如何来将原项目的 git 地址进行修改 ...
- GPIO原理与配置(跑马灯,蜂鸣器,按键)
一.STM32 GPIO固件库函数配置方法 1. 根据需要在项目中删掉一些不用的固件库文件,保留有用的固件库文件 2. 在stm32f10x_conf.h中注释掉这些不用的头文件 3. STM32的I ...
- 基于屏幕空间的实时全局光照(Real-time Global Illumination Based On Screen Space)
目录 Reflective Shadow Maps(RSM) RSM 的重要性采样 RSM 的应用与缺陷 Screen Space Ambient Occulsion(SSAO) SSAO Blur ...