zoukankan      html  css  js  c++  java
  • [loj3069]整点计数

    1.基础知识

    定义

    定义1.1(高斯整数):$mathbb{Z}[i]={a+bimid a,bin Z}$(其中$i$为虚数单位,即$i^{2}=-1$)

    定义1.2(范数):$N(alpha)=a^{2}+b^{2}$(其中$alpha=a+biin [i]$),显然$N(alpha)in N$

    定义1.3(基础运算):$+$和$ imes$,运算规则与通常的约定相同($ imes$可省略)

    定理1.1:$N(alphaeta)=N(alpha)N(eta)$

    定义1.4(整环):集合$X$和定义在$X$上的运算$oplus$和$otimes$($otimes$可省略),满足以下条件:

    • $oplus$和$otimes$满足交换律、结合律和分配律
    • 存在零元素$o$,使得$forall alphain X,ooplusalpha=alpha$
    • 存在幺元素$e e o$,使得$forall alphain X,ealpha=alpha$
    • $forall alphain X$,满足$exists etain X,alphaopluseta=o$
    • 若$alphaeta=o$,则$alpha=o$或$eta=o$

    则称$(X,oplus,otimes)$构成一个整环

    定理1.2:$([i],+, imes)$构成一个整环

    其中零元素$o=0$,幺元素$e=1$(显然两者唯一)

    根据第4个条件(显然$eta$唯一),定义$+$的逆运算$-$,与通常的约定相同

    定理1.3:$forall alphain [i],oalpha=o$

    定理1.4:若$gamma e o$且$alphagamma=etagamma$,则$alpha=eta$

    定理1.5:$forall alpha,etain mathbb{Z}[i]$且$alpha e o$,$exists p,rin [i],eta=palpha+r$且$N(r)lefrac{N(a)}{2}$

    设$alpha=a+bi$,则$(a+bi)(a-bi)=a^{2}+b^{2}=N(alpha)$

    因此,令$q=frac{(a-bi)eta}{N(alpha)}$,则$qalpha=frac{(a+bi)(a-bi)}{N(alpha)}eta=eta$

    记$[x]$表示与$x$最接近的整数,显然$|x-[x]|le frac{1}{2}$

    设$q=a'+b'i$(其中$a',b'in Q$),取$p=[a']+[b']iin mathbb{Z}[i],r=eta-palpha$即可,此时有
    $$
     N(r)=N(eta-palpha)=N((q-p)alpha)=((a'-[a'])^{2}+(b'-[b'])^{2})N(a)le frac{N(a)}{2}
    $$

    定义1.5(单位元素):$epsilonin [i]$,满足$existsalphain [i],epsilonalpha=e$,并记$alpha=epsilon^{-1}$(显然$alpha$唯一)

    定义1.6(单位元素集合):$varepsilon={epsilonmidepsilon$为单位元素$}$

    定理1.6:$varepsilon={pm1,pm i}$

    定义1.7(相伴):$alpha$与$eta$相伴当且仅当$existsepsilonin varepsilon,epsilon alpha=eta$,并记作$alphasim eta$

    定理1.7:相伴关系具有对称性、传递性和自反性

    整除

    定义1.8(整除):$alpha$整除$eta$当且仅当$exists kin [i],kalpha=eta$,并记作$alphamid eta$

    定理1.8:整除具有传递性和自反性

    定理1.9:$alphasim eta$当且仅当$alphamid eta$且$etamid alpha$

    定义1.9($alpha$的约数):$etain [i]$,满足$etamidalpha$

    定义1.10($alpha$的显然约数):$etain [i]$,满足$etain varepsilon$或$alphasimeta$

    定理1.10:$alpha$的显然约数为$alpha$的约数

    定义1.11(不可约数):$xiin [i]$,满足$xi e o,xi otin varepsilon$且$xi$的所有约数都为显然约数

    定义1.12(素数):$xiin [i]$,满足$xi e o,xi otin varepsilon$且$forall alpha,etain X,ximid alphaeta$当且仅当$ximidalpha$或$ximideta$

    定理1.11:素数为不可约数

    假设$xi$为素数但不为不可约数,由于$xi e o,xi otin varepsilon$,即有约数$alpha$满足$alpha otin varepsilon$且$xi otsimalpha$

    记$xi=alphaeta$,则$alpha,etamid xi$,考虑$eta$的性质:

    若$etainvarepsilon$,显然$xisimalpha$,矛盾

    若$xisim eta$,即$existsepsilonin varepsilon,xi=epsiloneta=alphaeta$,由于$xi e o$,必然有$eta e o$,也即$a=epsilonin varepsilon$,矛盾

    综上,即$eta otin varepsilon$且$xi otsimeta$

    事实上,这一段说明:若$xi e o,xi otin varepsilon$且$xi$不为不可约数,则$xi=alphaeta$(其中$alpha,eta otin varepsilon$且$xi otsimalpha,eta$)

    同时,根据定理1.8有$ximidalphaeta$,也即$ximidalpha$或$ximideta$

    由$alpha,etamidxi$,即可得到$xisimalpha$或$xisimeta$,矛盾

    定义1.13($alpha$和$eta$的公约数):$din [i]$,满足$dmidalpha,eta$

    定义1.14($alpha$和$eta$的最大公约数):$alpha$和$eta$的公约数$d$,满足$forall alpha,eta$的公约数$d',d'mid d$,并记$d=gcd(alpha,eta)$

    分解

    定义1.15($alpha$的分解):若干个不可约数$xi_{1},xi_{2},...,xi_{k}in [i]$,使得$alpha=xi_{1}xi_{2}...xi_{k}$

    定理1.12:$forall alphain [i]$且$alpha e o,alpha otin varepsilon$,$alpha$存在分解

    记$sigma(alpha)$为$alpha$的约数个数(相伴视作相同),对其按照$sigma(alpha)$归纳即可,具体如下——

    由于$alpha e o$且$alpha otinvarepsilon$,即$epsilon$和$alpha$都为$alpha$的约数且不相伴,也即$sigma(alpha)ge 2$

    若$sigma(alpha)=2$,显然等价于$a$为不可约数,取$xi_{i}={alpha}$即可

    若$sigma(alpha)<k$时$alpha$存在分解,考虑$sigma(alpha)=k$时(其中$kge 3$):

      由于$kge 3$,显然$alpha$不为不可约数,且由于$alpha e o,alpha otin varepsilon$,则$alpha=etagamma$(其中$eta,gamma otin varepsilon$且$alpha otsimeta,gamma$)

      由于$eta$的约数都是$alpha$的约数,但$alpha$不为$eta$的约数,即$sigma(alpha)>sigma(eta)$,同理$sigma(alpha)>sigma(gamma)$

      根据归纳,即$eta$和$gamma$存在分解,将两者分解组合即可

    同时,$sigma(alpha)$显然有限,即得证

    命题1.1:不可约数为素数

    命题1.2:$forall alpha,etain [i],gcd(alpha,eta)$存在,且$exists x,yin [i],xalpha+ yeta=gcd(alpha,eta)$

    命题1.3:$forall alphain [i]$且$alpha e o,alpha otinvarepsilon$,$alpha$的分解唯一(不考虑顺序,且若对应项相伴即相同)

    定理1.13:命题1.2成立

    若$alpha=eta=o$,取$gcd(alpha,eta)=o,x=y=o$即可

    若$alpha=o$或$eta=o$(不妨假设$alpha=o$且$eta e o$),取$gcd(alpha,eta)=eta,x=o,y=e$即可

    若$alpha,eta e o$,记$d=min_{x,yin mathbb{Z}[i],xalpha+yeta e o}xalpha+yeta$($min$指取$N(d)$最小的,若有多个任取即可)

      设$d=x_{0}alpha+y_{0}eta$,取$gcd(a,b)=d,x=x_{0},y=y_{0}$即可,证明如下——

      取$d'=x_{1}alpha+y_{1}eta$且$d' e o$,根据定理1.5有$exists p,rin [i],d'=pd+r$且$N(r)le frac{N(d)}{2}$

      由于$r=(x_{1}-px_{0})alpha+(y_{1}-py_{0})eta$,若$r e o$与$N(d)$最小性矛盾,即$r=o$,也即$dmid d'$

      取$x_{1}=1,y_{1}=0$和$x_{1}=0,y_{1}=1$时,则$d'=alpha$和$eta$,即有$dmidalpha,eta$

      若$d'$为$alpha$和$eta$的公约数,显然$d'mid d=x_{0}alpha+y_{0}eta$

    定理1.14:命题1.1,命题1.2和命题1.3两两等价

    证明参考《代数数论(第二版)》

    由此,即命题1.1和命题1.3也成立

    2.功能实现

    最大公约数

    前面已经说明代数系统$(mathbb{Z}[i],+, imes)$是唯一分解整环,即最大公约数一定存在

    进一步的,我们考虑$alpha,etain mathbb{Z}[i]$,如何求$gcd(alpha,eta)$

    此时,我们通过辗转相除法计算,假设$alpha=peta+r$(其中$N(r)le frac{N(eta)}{2}$),显然$dmidalpha,eta$和$dmid eta,r$是等价的(互相可以推导),因此$gcd(alpha,eta)=gcd(eta,r)$,递归下去即可

    结束条件为$eta=o$,此时取$gcd(alpha,eta)=alpha$显然满足条件($o$整除任何数)

    同时由于$N(r)le frac{N(eta)}{2}$,时间复杂度为$o(log N(alpha)+N(eta))$

    定理2.1:$forall alpha,etain mathbb{Z}[i]$且$x,y e o$,$N(gcd(alpha,eta))=min_{x,yin mathbb{Z}[i],xalpha+yeta e o}N(xalpha+yeta)$

    证明参考定理1.13的证明

    素数判定

    (由于是唯一分解整环,不可约数以下一律称为素数)

    为了方便,以下称整数意义下的素数为质数,其中模4余3的质数称为$4k+3$质数,其余的称为非$4k+3$质数(显然只能为2或模4余1)

    定理2.2:对于非$4k+3$质数$p$,$exists xin Z^{+},pmid x^{2}+1$

    若$p=2$,取$x=1$即可

    若$pequiv 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)$(威尔逊定理),也即$pmid x^{2}+1$

    考虑$xiin [i]$,如何快速判定$xi$是否是素数

    定理2.3:$xi$为素数当且仅当$N(xi)$为非$4k+3$质数或$N(xi)=p^{2}$(其中$p$为$4k+3$质数)

    • 充分性

    若$xi$不为素数,若$xi=o,xiinvarepsilon$即$N(xi)=0$或1,显然不为上述形式

    否则,设$xi=alphaeta$(其中$alpha,eta otin varepsilon$且$xi otsimalpha,eta$),也即有$N(alpha),N(eta) e 1$且$N(xi)=N(alpha)N(eta)$

    若$N(xi)$为(非$4k+3$)质数,那么$N(alpha)$和$N(eta)$中必然有一个1,矛盾

    若$N(xi)=p^{2}$(其中$p$为$4k+3$质数),由于$N(alpha),N(eta) e 1$,必然是$N(alpha)=N(eta)=p$

    设$alpha=a+bi$,则$N(alpha)=a^{2}+b^{2}=pequiv 3(mod 4)$,而$a^{2},b^{2}equiv 0,1(mod 4)$,显然不存在 

    • 必要性

    设素数$xi=a+bi$,则$(a+bi)(a-bi)=N(xi)$,也即$xi=a+bimid N(xi)$

    对$N(xi)$质因数分解,记$N(xi)=p_{1}p_{2}...p_{k}$(其中$p_{i}$为质数),根据$xi$为素数即$exists 1le ile k,ximid p_{i}$

    不妨假设$ximid p=p_{i}$,即$N(xi)mid N(p)=p^{2}$,同时$pmid N(xi)$

    若$N(xi)=p$,上面已经说明$N(xi)$不能为$4k+3$质数,即$N(xi)$为非$4k+3$质数

    若$N(xi)=p^{2}$,假设$p$为非$4k+3$质数:

      根据定理2.2有$exists xin Z^{+},pmid x^{2}+1=(x+i)(x-i)$

      显然$p otmid xpm i$,即$p$不为素数,显然$xisim p$也不为素数,矛盾

    因此$p$为$4k+3$质数,即得证

    分解

    下面,考虑来分解一个$alphain [i]$且$alpha ot e o,alpha otin 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 1le ile k$且$p_{i}$为非$4k+3$质数恰有$a_{i}$个$N(xi)=p_{i}$

    2.$forall 1le ile k$且$p_{i}$为$4k+3$质数,恰有$frac{a_{i}}{2}$个$N(xi)=p_{i}^{2}$(这里$a_{i}$一定为偶数)

    由此,$forall 1le ile s,N(xi_{i})$已经确定,不妨枚举所有$xi$使得$N(xi)=N(xi_{i})$且$ximidalpha$,然后将其除掉,重复此过程即可得到最终的分解

    暴力枚举时间复杂度为$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$在$[i]$中分解为$prod_{i=1}^{k}xi_{i}$,则$p^{2}=prod_{i=1}^{k}N(xi_{i})$

    由于$xi_{i}$都是素数,则$N(xi_{i}) eq 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,din Z$)

    由于$a^{2}+b^{2}=(a+bi)(a-bi)$,即$a+bimid c^{2}+d^{2}=(c+di)(c-di)$

    由于$N(a+bi)=N(xi)$,显然$a+bi$在$([i],+, imes)$中为素数,即$a+bimid c+di$或$a+bimid c-di$

    不妨假设$a+bimid c+di$,设$c+di=epsilon(a+bi)$,由于$N(a+bi)=N(c+di)$,即$N(epsilon)=1$,也即$epsilonin 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$质数,$zin 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$为质数,即$pmid a-zb$或$pmid a+zb$

    不妨假设$pmid a-zb$,设$a-zb=kp$,即$a+bi=(kp+zb)+bi=kp+b(z+i)$

    记$d=gcd(p,z+i)$,显然$dmid a+bi$,即$N(d)mid N(a+bi)=p$

    同时,由于$a+bimid (a+bi)(a-bi)=p$,即$a+bimid b(z+i)$

    由于$N(a+bi)=p$,即$a+bi$为素数,显然$a+bi otmid b$,也即$a+bimid z+i$

    由于$a+bimid p,z+i$,即$a+bimid d$,也即$N(a+bi)=pmid N(d)$

    综上,即$N(d)=p$

    由此,取$xi=gcd(p,z+i)$即可

    关于如何求$z$,对$p$分类讨论——

    当$p=2$时,显然$z=1$即可

    当$pequiv 1(mod 4)$时,由于$(-1)^{frac{p-1}{2}}equiv 1(mod p)$,即$-1$是模$p$的二次剩余,那么$z$是存在的

    关于$z$的具体求法,不断随机$1le c<p$使得$c^{frac{p-1}{2}}equiv -1(mod p)$,那么取$zequiv c^{frac{p-1}{4}}(mod p)$即可

    关于随机的复杂度,有以下结论——

    定理2.6:在$1le 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 }
    View Code

    3.题目

    题面

    记$f(x)=sum_{alphain mathbb{Z}[i],N(alpha)=x^{2}}1$,求$sum_{i=1}^{N}f(i)^{K}$,答案对$P$取模

    $1le N,Kle 10^{11}$,$10^{8}le Ple 10^{9}+7$

    Subtask1:$Nle 8 imes 10^{3}$

    Subtask2:$Kge 15$,$P$为2的幂次

    Subtask3:$Nle 2 imes 10^{7}$

    Subtask4:$Nle 2 imes 10^{8}$,$1le Kle 2$

    Subtask5:无特殊限制

    Subtask1

    关于$f(x)$,我们分别枚举$a$的实部和虚部,也即$sum_{a,bin 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,bin Z^{+},a^{2}+b^{2}=x^{2}}1$,显然$f(x)=4g(x)+4$

    由于$g(x)in Z$,因此$4mid 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,cin 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+mequiv 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)$,即$dmid 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}=cle N$,因此$n$和$m$的范围都是$o(sqrt{N})$的,这一部分复杂度为$o(N)$

    关于$d$的枚举,总复杂度恰为勾股数的对数,也即$sum_{i=1}^{N}g(i)$,约为$10^{8}$

    最后,再$o(Nlog K)$求出$sum_{i=1}^{N}(4g(i)+4)^{K}$即可

    时间复杂度为$o(sum_{i=1}^{N}g(i)+Nlog K)$,可以通过

    Subtask4

    考虑从$(mathbb{Z}[i],+, imes)$的角度来求$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,etain [i]$满足$N(alpha)=N(eta)=x^{2}$,$alpha$和$eta$相伴当且仅当两者的分解相同(不考虑顺序,且若对应项相伴即相同)

    换言之,统计$g(x)$可以改为统计有多少种分解方式,且由于$N(xi_{i})$的形式是确定的,只需要分别统计每一项的方案数即可

    根据定理2.4,若$N(xi_{i})=a^{2}+b^{2}$,解$xi=pm apm bi$或$pm bpm 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_{1le ile k,p_{i}equiv 1(mod 4)}(2a_{i}+1)$

    预处理$o(N)$筛出每一个数的最小素因子,即可$o(log x)$求出$x$质因数分解的结果,也即可求出$g(x)$

    由于每一个$g(x)$都是独立计算的,且$K$只有两种,通过分块打表优化即可

    最后,再$o(N)$求和即可($1le Kle 2$)

    时间复杂度为$o(N+alpha log N)$(其中$alpha$为打表的间隔,取$4 imes 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={imid ile sqrt{N}or i=lfloorfrac{N}{x} floor}$,$S_{1}(n)=sum_{p_{i}le n}h(p_{i})$,$S_{2}(n,m)=sum_{2le ile n,p_{m}<min_{i}}h(i)$

    问题即求$1+S_{2}(N,0)$,有如下转移——
    $$
    S_{2}(n,m)=sum_{p_{m}<p_{i}le sqrt{n},ege 1,p_{i}^{e}le n}h(p_{i}^{e})(1+S_{2}(lfloorfrac{n}{p_{i}^{e}} floor,i))+(S_{1}(n)-S_{1}(max(p_{m},sqrt{n})))
    $$
    考虑递归计算$S_{2}(N,0)$,在$sqrt{n}<p_{m}$时,前者即为0,直接返回后者即可,因此需要继续递归的状态$(n,m)$都满足$nin S$且$mle pi_{sqrt{n}}$

    接下来,考虑$forall nin S$预处理出$S_{1}(n)$,即$sum_{1le ile n,i为素数,iequiv 1(mod 4)}1$

    定义$S_{r}(n,m)=sum_{2le ile n,i为素数或p_{m}<min_{i},iequiv r(mod 4)}1$(其中$rin {1,3}$),注意到若$i$不为素数,总有小于等于$sqrt{N}$的素因子,因此有$S_{1}(n)=3^{K}S_{1}(n,pi_{sqrt{n}})+(S_{3}(n,pi_{sqrt{n}})+[nge 2])$

    初始即$S_{r}(n,0)=egin{cases}lfloorfrac{n-1}{4} floor&(r=1)\lfloorfrac{n+1}{4} floor&(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 otequiv 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}(lfloorfrac{n}{p_{m}} floor,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_{roplus 2}(lfloorfrac{n}{p_{m}} floor,m-1)-S_{roplus 2}(p_{m}-1,m-1))$

    关于这两个转移,考虑将$min_{i}=p_{m}$的$i$除以$p_{m}$,此时范围即$lfloorfrac{n}{p_{m}} floor$,但根据定义,$S_{r}(lfloorfrac{n}{p_{m}} floor,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 }
    View Code

    拓展

    定义$f'(x)=sum_{ain mathbb{Z}[i],N(a)=x}1$,考虑如何求$f'(x)$,类似地有以下结论——

    将$x$质因数分解,设为$prod_{i=1}^{k}p_{i}^{a_{i}}$,若$exists 1le ile k,p_{i}equiv 3(mod 4)$且$a_{i}equiv 1(mod 2)$,则答案为0,否则答案与之前相同,即$f'(x)=4prod_{1le ile k,p_{i}equiv 1(mod 4)}(a_{i}+1)$

    构造$chi(x)=egin{cases}1&xequiv 1(mod 4)\-1&xequiv -1(mod 4)\0&xequiv 0(mod 2)end{cases}$,每一个$p_{i}^{a_{i}}$对答案的贡献,都可以表示为$sum_{j=0}^{a_{i}}chi(p_{i}^{j})$(具体验证可分类讨论,这里就省略了)

    换言之,即$f'(x)=4prod_{i=1}^{k}sum_{j=1}^{a_{i}}chi(p_{i}^{j})$

    考虑$chi(x)$,不难证明其为(完全)积性函数,将后者展开,即有$f'(x)=4sum_{dmid x}chi(d)$

    (另外,当$x=0$时其不满足此式子,此时显然$f'(x)=1$)

    考虑这样一个问题:求以$(0,0)$为圆心、$R$为半径的圆内整点数($Rin Z^{+}$)

    显然,答案即$sum_{i=0}^{R^{2}}f'(i)=1+4sum_{i=1}^{R^{2}}sum_{jmid i}chi(j)=1+4sum_{i=1}^{R^{2}}lfloorfrac{R^{2}}{i} floorchi(i)$

    另一方面,每一个整点可以看作“几乎”对应于一个$1 imes 1$的小方格,因此可以认为整点数与圆的面积接近,即得到式子$pi R^{2}approx 1+4sum_{i=1}^{R^{2}}lfloorfrac{R^{2}}{i} floorchi(i)$

    再进一步的估计,即有$piapprox 4sum_{i=1}^{R^{2}}frac{chi(i)}{i}=4(1-frac{1}{3}+frac{1}{5}-frac{1}{7}+frac{1}{9}...)$

    (虽然之前的描述并不严谨,但事实上这是正确的)

  • 相关阅读:
    tailf,tail -f,tail -F区别
    Java多线程知识总结(一)
    MyBatis使用总结
    mina学习总结
    好书推荐
    Hessian总结
    Spring总结
    SpringMVC总结
    判断两个IP是否处于同一子网(网段)
    Delphi Json之树遍历
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/14931861.html
Copyright © 2011-2022 走看看