數論 FZU1759 降冪公式(尤拉函式 快速冪)

2021-08-24 23:41:10 字數 2029 閱讀 9369

given a,b,c, you should quickly calculate the result of a^b mod c. (1<=a,c<=1000000000,1<=b<=10^1000000).

there are multiply testcases. each testcase, there is one line contains three integers a, b and c, separated by a single space.

for each testcase, output an integer, denotes the result of a^b mod c.

3 2 4

2 10 1000

a^b mod c = ?

b<=10^1000000,超級大數了,a,c均為long long範圍內。

因為資料很大所以本題用降冪公式,嘛我的菜雞水平也只能直接套公式了嚶

降冪公式

φ(m)(phi哈哈哈哈是這個音來著)是尤拉函式。

那麼尤拉函式

對於乙個正整數n,小於n且和n互質的正整數(包括1)的個數,記作φ(n) 。

φ(1)=1。(唯一和1互質的數就是1本身)。

對於質數p,φ(p) = p - 1。(除去它本身)

尤拉定理:對於互質的正整數a和n,有a^φ(n) ≡ 1 mod n。

尤拉函式是積性函式:若m,n互質,φ(mn)=φ(m)φ(n)(積性函式表示式)。

那麼思考,n是質數p的k次冪,有φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因為除了p的倍數外,其他數都跟n互質。

尤拉函式的性質:

設p為n的質因數,

若(n % p == 0 && (n / p) % p == 0) 則有φ(n)=φ(n / p) * p;

若(n % p == 0 && (p / p) % p != 0) 則有:φ(n) = φ(n / p) * (p - 1)。

求尤拉函式:

法一:

long long euler(long long x)  //直接求尤拉函式 //還有一種線性篩法}}

if(x>1) res*=(x-1);

return res;

}

法二:

//求尤拉函式 相當於不斷減去

long long phi(long long x)

}if(x>1)

res=res-res/x;

return res;

}

本題只需套公式,先求出c的尤拉函式,大數b不斷讀入不斷模,(高位的能模的最後的數也能模掉這樣子),得出新的次方數b,再進行對a^newb mod c進行快速冪即可。

注:本題需用%i64d。

**:

#include #include #define ll long long

const int maxc=1e6+20;

long long a,c,phic,numb;

char b[maxc];

long long euler(long long x) //直接求尤拉函式 //還有一種線性篩法}}

if(x>1) res*=(x-1);

return res;

}long long qpow(long long a,long long n,long long mod) //快速冪

a=(a*a)%mod;

n>>=1; //一定不要再忘記=了orz

}return ans;

}int main()

return 0;

}

尤拉函式,擴充套件尤拉降冪

尤拉函式 phi n 表示下於n且與n互質的整數的個數。模板 include include include define il inline define maxn 200100 include define ll long long using namespace std 這個函式是求1 n內小...

尤拉函式與尤拉降冪

尤拉函式 對於正整數 n 尤拉函式是小於或等於 n 的正整數中與 n 互質的數的數目。varphi 1 1 除了1之外,所有正整數與它本身都不互質 對於質數 p varphi p p 1 sum varphi d n 其中 d 是 n 的因數 尤拉函式是積性函式,若 m,n 互質,則有 varphi...

fzu 1752(尤拉降冪模板題!)

given a,b,c,you should quickly calculate the result of a b mod c.1 a,c 1000000000,1 b 10 1000000 input there are multiply testcases.each testcase,ther...