约数问题

1、a|b

性质:

(1)若a|b且a|c,则对任意x,y,有a|(xb+yc);
(2)若a|b且a|c,则a|c;
(3)设m!=0,则a|b,当且仅当ma|mb;
(4)若a|b且b|a,则a=±b;
带余除法:设a,b是两个正整数,且b!=0,则存在唯一的整数q和r,使a=qb+r(0<=r<|b|).

2、算术基本定理的推论

对于N=P1C1•P2C2•......•PmCm,则N的正约数集合可写成{P1b1•P2b2•......•Pmbm},其中0<=bi<=ci

N的正约数个数:(c1+1)•(c2+1)•......•(cm+1)
Ny :(yC1+1)•(yC2+1)•......•(yCm+1)
N的所有正约数的和:(1+P1+P12+......+P1C1)•(1+P2+P22+......+P2C2)•......•(1+Pm+Pm2+......+PmCm)

3、约数和

3.1 单个数约数和

时间复杂度:O(√n)

for(int i=1;i*i<=n;++i){
   if(n%i==0){
     f[++cnt]=i;
     if(i!=n/i) f[++cnt]=n/i;
   }
}

3.2 N个数约数和(打表)

时间复杂度:O(n√n)

vector<int> f[N];
for(int i=1;i<=n;++i)
   for(int j=1;j<=n/i;++j)
      f[i*j].push_back(i);

3.3 N个数约数和的和(整除分块)

时间复杂度:O(n)

(1)for(int i=1;i<=n;++i) ans+=(n/i*i);

(2)ll fun(ll x)
    {
	ll ans=0;
	for(ll l=1,r;l<=x;l=r+1){
	   r=x/(x/l);
	   ans+=(r-l+1)*(x/l)*(l+r)/2;
	}
    }

原文地址:https://www.cnblogs.com/unravel-CAT/p/15350806.html