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}...)$

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

  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/14931861.html
Copyright © 2011-2022 走看看