Extended Euclidean inverse element (as long as a and B are mutually unique, there is a inverse element)

[Cpp]

# Include <cstdio>

# Include <cstring>

# Include <cstdlib>

# Include <cmath>

# Define mod 9973.

Typedef long ll;

Void ExGcd (int a, int B, int & x, int & y ){

If (B = 0 ){

X = 1;

Y = 0;

Return;

}

ExGcd (B, a % B, x, y );

Int t = x;

X = y;

Y = t-a/B * y;

}

Int main (){

Int t, T, rev, x;

Int a, B;

Scanf ("% d", & T );

For (t = 1; t <= T; t ++ ){

Scanf ("% d", & a, & B );

ExGcd (B, mod, rev, x );

Printf ("% d \ n", (rev * a) % mod + mod) % mod );

}

}

O (n) base number table

[Cpp]

Int pn = 0, prime [MAXN], factor [MAXN]; // The minimum approximate number of elements whose factor [I] Is I

Void get_prime (int n ){

Int I, j;

For (I = 1; I <= n; I ++)

Factor [I] = I;

For (I = 2; I <= n; I ++ ){

If (I = factor [I]) prime [pn ++] = I;

For (j = 0; j <pn & prime [j] * I <= n; j ++ ){

Factor [I * prime [j] = prime [j];

If (I % prime [j] = 0)

Break;

}

}

}

POJ 1845 binary (1 + x ^ 2... + x ^ n) summation

[Cpp]

# Include <cstdio>

# Include <cstring>

# Include <cstdlib>

# Include <cmath>

# Define mod 9901.

Typedef long ll;

Const int MAXN = 10000;

Int a, B, k;

Int p [MAXN], n [MAXN];

Ll quick (ll num, ll mi ){

Ll ans = 1;

While (mi ){

If (mi % 2) ans = (ans * num) % mod;

Num = (num * num) % mod;

Mi/= 2;

}

Return ans % mod;

}

Ll sum (ll num, ll mi ){

If (mi = 0) return 1;

If (mi % 2)

Return (sum (num, mi/2) * (1 + quick (num, mi/2 + 1) % mod;

Return (sum (num, mi/2-1) * (1 + quick (num, mi/2 + 1) + quick (num, mi/2) % mod;

}

Void factor (int ){

Int I;

K = 0;

For (I = 2; I * I <= a;) {// complexity decomposition INTEGER OF sqrt (n)

If (a % I = 0 ){

P [k] = I;

N [k] = 0;

While (a % I = 0 ){

N [k] ++;

A/= I;

}

K ++;

}

If (I> 2) I + = 2;

Else I ++;

}

If (a> 1 ){

P [k] =;

N [k] = 1;

K ++;

}

}

Int main (){

Int I;

Scanf ("% d", & a, & B );

Factor ();

Int ans = 1;

For (I = 0; I <k; I ++)

Ans = (ans * (sum (p [I], n [I] * B) % mod;

Printf ("% d \ n", ans );

}

POJ 1845 reverse RMB Method

[Cpp]

# Include <cstdio>

# Include <cstring>

# Include <cstdlib>

# Include <cmath>

# Define mod 9901.

Typedef long ll;

Const int MAXN = 10000;

Int a, B, k;

Int p [MAXN], n [MAXN];

Void ExGcd (int a, int B, int & x, int & y ){

If (B = 0 ){

X = 1;

Y = 0;

Return;

}

ExGcd (B, a % B, x, y );

Int t = x;

X = y;

Y = t-a/B * y;

}

Int reverse (int num ){

Int rev, x;

ExGcd (num, mod, rev, x );

Return rev;

}

Ll quick (ll num, ll mi ){

Ll ans = 1;

While (mi ){

If (mi % 2) ans = (ans * num) % mod;

Num = (num * num) % mod;

Mi/= 2;

}

Return ans % mod;

}

Ll sum (ll num, ll mi ){

If (num % mod = 1) // note that this situation cannot be reversed because the num-1 and mod are not mutually exclusive

Return (mi + 1) % mod;

Return (quick (num, mi + 1)-1 + mod) % mod) * reverse (num-1) % mod + mod) % mod;

}

Void factor (int ){

Int I;

K = 0;

For (I = 2; I * I <= a;) {// complexity decomposition INTEGER OF sqrt (n)

If (a % I = 0 ){

P [k] = I;

N [k] = 0;

While (a % I = 0 ){

N [k] ++;

A/= I;

}

K ++;

}

If (I> 2) I + = 2;

Else I ++;

}

If (a> 1 ){

P [k] =;

N [k] = 1;

K ++;

}

}

Int main (){

Int I;

Scanf ("% d", & a, & B );

Factor ();

Int ans = 1;

For (I = 0; I <k; I ++)

Ans = (ans * (sum (p [I], n [I] * B) % mod + mod) % mod;

Printf ("% d \ n", ans );

}

SPOJ DIVSUM

[Cpp]

# Include <cstdio>

# Include <cstring>

# Include <cstdlib>

# Include <cmath>

Const int MAXN = 1501000, N = 500010;

Int pn = 0, prime [MAXN], factor [MAXN];

Void get_prime (int n ){

Int I, j;

For (I = 1; I <= n; I ++)

Factor [I] = I;

For (I = 2; I <= n; I ++ ){

If (I = factor [I]) prime [pn ++] = I;

For (j = 0; j <pn & prime [j] * I <= n; j ++ ){

Factor [I * prime [j] = prime [j];

If (I % prime [j] = 0)

Break;

}

}

}

Int main ()

{

Int cases;

Get_prime (N );

Scanf ("% d", & cases );

While (cases --)

{

Int n, tmpn;

Long ans = 1;

Scanf ("% d", & n );

Tmpn = n;

While (tmpn! = Factor [tmpn])

{

Long fac = factor [tmpn], mtp = fac;

While (tmpn % fac = 0)

{

Mtp * = fac;

Tmpn/= fac;

}

Ans * = (1-mtp)/(1-fac );

}

If (tmpn> 1)

Ans * = (1 + tmpn );

Ans-= n;

Printf ("% lld \ n", ans );

}

Return 0;

}

SPOJ DIVSUM ANOTHER METHOD

[Cpp]

# Include <cstdio>

Using namespace std;

Int sum [500100];

Int main ()

{

Int T, t, I, j, n;

Scanf ("% d", & T );

For (I = 1; I <= 500000; I ++ ){

For (j = 2; I * j <= 500000; j ++) {// If j starts from 1, it will calculate itself

Sum [I * j] + = I;

}

}

For (t = 1; t <= T; t ++ ){

Scanf ("% d", & n );

Printf ("% d \ n", sum [n]);

}

}