typedef long long integer;
integer gcd(integer a, integer b){
if (a<b) swap(a, b);
if (b==0) return a;
return gcd(b, a%b);
}
實作超短
用大的除以小的,簡單遞迴
時間複雜度?
跟費氏數列有關!
位元運算比模運算快
typedef long long integer;
integer gcd(integer a, integer b){
if (a<b) swap(a, b);
if (b==0) return a;
if ((a&1)==0 && (b&1)==0) return 2*gcd(a>>1, b>>1);
if ((a&1)==0) return gcd(a>>1, b);
if ((b&1)==0) return gcd(a, b>>1);
return gcd(b, a-b);
}
\\ a>b
void exgcd(ll a, ll b, ll &x, ll &y, ll &d) {
if (b==0) {
x = 1, y = 0, d = a;
return;
}
exgcd(b, a%b, x, y, d);
ll t = x;
x = y;
y = t-(a/b)*y;
}
有沒有可能更好?(十個log都比根號好)
(同時也可質因數分解)
for (int i=2; i*i<=N; i++) if (!sieve[i])
for (int j=i*2; j<=N; j+=i)
sieve[j] = true;
複雜度?
for (int i=2;i<N;i++){
if (!sieve[i]) prime.push_back(i);
for (int j=0;i*prime[j]<N;j++){
sieve[i*prime[j]] = true;
if (i%prime[j]==0) break;
}
}
每個合數都只被其最小質因數篩到
由Bézout's Identity知
且取模後模逆元唯一
再來看看更多怪怪的解法