1. 程式人生 > >高次方取模(template)

高次方取模(template)

就是求(a^b)% p ,a,b,p比較大
取餘公式:(a*b)%p=(a%p*b%p)%p
演算法核心就是下面兩個公式:
這裡寫圖片描述

//次方求模模板
template<class Type>
inline Type ModPow(Type m,Type n,Type p) //m的n次方模p
{
    if(n==0) return 1;
    if (n==1) return m%p;
        Type tmp=ModPow(m,n>>1,p);
    return (tmp*tmp%p)*((n%2?m:1)%p)%p;
}
//REF:[C小加](http://www.cppblog.com/cxiaojia/archive/2012/04/06/170268.html)
/*高次方求模:
比如a的b次方對c求模
我們可以把b 化為二進位制形式看那一位有1
比如b=10101則  a^b=a^(10000)*a^(100)*a^(1)
以函式形式體現:*/
template<class Type>
inline Type han()
{
    Type t,s;
    for(t=a,s=1;b;b>>=1,t*=t,t%=c)//用b>>=1檢視b中1
     if(b&1){s*=t;s%=c;}
    return s%c;
}
//REF:[知行執行](http://www.cnblogs.com/zhixingqiezhixing/archive/2012/02/18/2356655.html
)

btw , 大數取模的模板
取餘公式:(a+b)%p=(a%p+b%p)%p;

char big_number[MAX];
template<class type>
type big_mod(char *a,type mod){
    type len=strlen(a),result=0;
    for(int i=0;i<len;i++){
        result=((result*10)%mod+(a[i]-'0')%mod)%mod;
        //如果資料不算太大,可以寫成這樣來節省時間result=(result*10+a[i]-'0')%mod;
    }
    return
result; } //test char s[200]; int main() { while(gets(s)) cout<<big_mod<int>(s,2)<<endl; }

相關推薦

次方(template)

就是求(a^b)% p ,a,b,p比較大 取餘公式:(a*b)%p=(a%p*b%p)%p 演算法核心就是下面兩個公式: //次方求模模板 template<class Type>

除數為2的N次方可以用與運算替代,效率更

 取模運算在包括JAVA在內的大多數語言中的效率都十分低下,而當除數為2的N次方時,取模運算將退化為最簡單的位運算,其效率明顯提升(按照Bruce Eckel給出的資料,大約可以提升5~8倍) 。看看JDK中是如何實現的:  Java程式碼: staticint ind

ac數論之n次方

傳送門次方求模時間限制:1000 ms  |  記憶體限制:65535 KB難度:3描述求a的b次方對c取餘的值輸入第一行輸入一個整數n表示測試資料的組數(n<100)每組測試只有一行,其中有三個正整數a,b,c(1=<a,b,c<=1000000000)輸

次方

有了這個公式,求解問題就簡單了,n的p次方很容易拆分為幾個數相乘的形式。其中採用二分法拆分較為簡單高效。 遞迴: #define M 10003 int PowMod(int n, int

2017湘潭賽 A題 Determinant (斯消元)

mina while 代數 tor mod continue 高斯消元 problem 元素 鏈接 http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1260 今年湘潭的A題 題意不難 大意是把n*(n

數學之冪次

大神 bsp alt ron mage str 博客 htm com 盜自倉鼠大神博客:http://www.cnblogs.com/linyujun/p/5194170.html 用於解決(a^b)%p類問題,當b很大時 好像運用到費馬小定理,不會證明 φ(

【2018icpc焦作網路賽 Save the Room】【組合數【隔板法】【次冪

【連結】 【題意&思路】  把一個數拆分成一個數的和求方法數。 比如 4=1+1+1+1=1+1+2=2+2=1+3=4 相當於有(n-1)個空插隔板,方法數即為2^(n-1). 【程式碼】 #include<bits/stdc++.h>

求N的N次方(快速冪

分治演算法的設計思想是,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。 例題:給定一個整數N(N<=1 000 000 000),求N的N次方的最後一個數字。 首先,暴力的時間複雜度為O(N),對於較大的N顯然太慢。所以我們選取快

次冪 (快速冪)

來自百度文庫 PPT作者 張鵬 只能說下載分數太貴了。。 基本概念及思想 ¡對形如a^b mod m 的運算(b一般較大) ¡但a,b,m都在long型範圍內 ¡演算法的主要思想是分治,分而治之。將大的問題分成若干個相似的較小的問題! ¡具體實現是用遞迴的方法! 舉例

求大數的n次方對m(尤拉降冪)

博主連結 #include <stdio.h> #include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; cons

hdu3364-斯消元(

列n個方程,表示每個燈會被哪些開關控制, 得到一個一個n*m的矩陣,最後一列為所要求的狀態 則對這個(n+1)*(m)的矩陣高斯消元,得到方案數,答案爆int #include <cstdio> #include <cmath> #inclu

計蒜客 Give Candies (2的次冪)

題目意思 大數輸入,求2的n-1次方 解題思路 2的n次方對mod取模會產生mod/2的迴圈,所以在大數陣列轉換成LL的時候取模要用mod/2,如果直接用mod在1e9+8時候出錯。不

poj 2065 斯消元解方程組

題意: a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1) a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2) ...... a0*n^0 + a1*n^1+a

CSU - 1556 Jerry&#39;s trouble(高速冪)

click ostream algo printf 高速 ron main 取模 bit 【題目鏈接】:click here 【題目大意】:計算x1^m+x2^m+..xn^m(1<=x1<=n)( 1 <= n < 1 000 000, 1 &

求第n行楊輝三角(n很大,

int 為什麽不能 style code 為我 max sin clas pan 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 typedef

運算

add 結合 重要 nbsp left 但是 list padding 四則運算 腦子不好使,老是記不住(?_?),備忘一下。 模運算與基本四則運算有些相似,但是除法例外。其規則如下: (a + b) % p = (a % p + b % p) % p (a -

UVa 11582 Colossal Fibonacci Numbers! 【大數冪

term sign fontsize name fib sep iss style watermark 題目鏈接:Uva 11582 [vjudge] 題意 輸入兩個非負整數a、b和正整數n(0<=a,b<=2^64,1<=n<=1000

HihoCoder 1153 分數

了吧 利用 phi %d hiho 單點 但是 輸入 nbsp 時間限制:1000ms 單點時限:10000ms 內存限制:256MB 描述 給定三個正整數 a、 b 和 p,滿足 b 和 p 互質。這時分數 a / b 除以 p 的余數,即 a / b MOD p 可以定

id分表

bsp _id user 用戶 用戶id 取模 場景 nbsp var 場景 1 假設按用戶id分2個庫 每個庫分10張表。 分表策略 1.用戶id%2 確定庫 用戶id%3確定表。 2.(用戶id%(2*10))/ 10 取整確定庫,(用戶id%(2*10)%

ACM

防止 .com 大整數取模 for man 分治算法 dex cin ima 取模公式: (a+b) mod n=((a mod n)+(b mod n))%n (a-b) mod n=(a mod n -b mod n +n)mod