O(n)求1~n的逆元
原地址:http://www.2cto.com/kf/201401/272375.html
前提是MOD是個素數。
新學的一個求逆元的方法:
inv[i] = ( MOD - MOD / i ) * inv[MOD%i] % MOD
證明:
設t = MOD / i , k = MOD % i
則有 t * i + k == 0 % MOD //(t*i+k) = MOD
有 -t * i == k % MOD
兩邊同時除以ik得到
-t * inv[k] == inv[i] % MOD
即
inv[i] == -MOD / i * inv[MOD%i]
即
inv[i] == ( MOD - MOD / i) * inv[MOD%i]
證畢
能夠O(n)時間求出1~n對模MOD的逆
O(n)求1~n的逆元
相關推薦
O(n)求1~n的逆元
n) mod 一個 -m 是個 .html 地址 得到 href 原地址:http://www.2cto.com/kf/201401/272375.html 前提是MOD是個素數。 新學的一個求逆元的方法: inv[i] = ( MOD - MOD /
LightOJ - 1117 Helping Cicada (求1~n有多少個數不能被這m個數中任意一個整除)(容斥+狀態壓縮)
vol == show fine cst href main http color 題意:http://www.lightoj.com/volume_showproblem.php?problem=1117 考慮1個數k,1~n有[n/k]個數能被k整除,[a]表示a向下取
模板(線性時間求1~n的所有歐拉函數值)
namespace 別人 mat 假設 name www tle http scan 定理: (以下p均為質數) 1. φ(p)=p-1 3. 如果 i mod p ≠ 0 那麽 φ(i*p)=φ(i)*φ(p) 2. 如果
C語言:完美數,求1-n之間的
輸入n,求1-n之間的完美數 完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。如果一個數恰好等於它所有的因子之和,則稱該數為“完全數”。具體完美數定義請見完美數-百度百科 #include "stdio.h" void main() { int
BZOJ3994:約數個數和(莫比烏斯反演:求[1,N]*[1,M]的矩陣的因子個數)
Description 設d(x)為x的約數個數,給定N、M,求 Input 輸入檔案包含多組測試資料。 第一行,一個整數T,表示測試資料的組數。 接下來的T行,每行兩個整數N、M。 Ou
從鍵盤中輸入一個整數n,求1-n的和,以及偶數和、奇數和
n=int(input("從鍵盤中輸入一個數:")) sum1=0 sum2=0 sum3=0 i=1 while i<=n: sum1+=i if i%2==0: sum2+=i else:
T29:求1~n整數中1出現的次數
求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1
【C語言】求1-N的和(遞迴法)
遞迴公式: 條件:f(1) = 1 遞迴條件:f(n-1) + n 為了手機顯示方便(配圖): 程式碼為: //求1-N的和 #include "stdio.h" int f(int n) { //定義函式f 出口為n等於1,否則將n與f(n-1)相
Min_25篩初級應用:求$[1,n]$內質數個數
#include <bits/stdc++.h> #define rin(i,a,b) for(int i=(a);i<=(b);++i) #define irin(i,a,b) for(int i=(a);i>=(a);--i) #define trav(i,a) for(int i
容斥原理 —— 求1~n有多少個數與k互質(二進位制演算法詳細解釋&模板)
這裡有一道經典的例題,可以看一下:點選開啟連結 這裡的n可能要大於k的,所以不能用尤拉函式去做。 我們首先把k分解質因數,儲存到p陣列中,num表示質因子的數量。 void pr(int k) //求k的質因子 { num = 0; for (int i = 2 ;
SPOJ Equation :求 1/n!=1/x+1/y 的解的個數
解析: 題目就是求1/n! = 1/x + 1/y 的解的個數,看樣例知要考慮(x,y)對數的關係。 設 m=n! ,由等式知x,y必定大於n!,所以再設 x=n!+k=m+k 帶入 1/m=1/
UVA 12493 Stars (尤拉函式--求1~n與n互質的個數)
大致題意:圓上有偶數n個點,每m個點連起來,最後可以把所有點串聯起來就合法。問有多少個m可以完成串聯,串聯後形狀相同的算重複 n <2^31 思路:可以寫個暴力程式,可以發現只要m與n互質,就可以完成串聯,所以用尤拉函式解決 證明: 設cnt為當第一次達到原點時
求1~n與x互質的數的個數(6個題、容斥原理)
HDU 4135、POJ 2773、HDU 1695、HDU 2841、ZOJ 2836、HDU 1796 HDU 4135 Co-prime 題意: 求[l,r]與x互質的數的
求1-N之間所有的素數。
描述 輸出1-N之間所有的素數。 輸入 一個整數N。(2 <=N <= 10000) 輸出 1-N之間所有的素數,含N,為了便於觀察結果,在控制檯裡每行輸出5個數,並且這五個數之間以一個空格作為分隔。 #include <stdio
不使用迴圈遞迴的方式求1~n的和
今天在牛客網上看到一道面試題,感覺很有意思自己也思考了很長時間,希望可以分享下來,題目是這樣描述的: 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。 剛開始的時候
hdu3501 給出一個N,求1..N中與N互質的數的和
給出一個N,求1..N中與N互質的數的和 ifgcd(n,i)=1 then gcd(n,n-i)=1 (1<=i<=n) 反證法: 如果存在K!=1使gcd(n,n-i)=k,那麼(n-i)%k==0 而n%k=0
求1~n中與m互質的數的個數(m>n) 附hdu1695題解(尤拉函式+容斥原理)
int calc(int n,int m) { //求1~n 與m互質的數的個數 int num=getFactors(m); //先將m分解質因數 int sum=0; //先求出不互質的個數,最後用n減去該數 for(int state=1;
51nod 1040 求1-n這n個數,同n的最大公約數的和(尤拉函式)
題目:給出一個n,求1-n這n個數,同n的最大公約數的和。比如:n = 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 = 15 思路:一個數與n的最大公約數肯定是n的因子中的一個,所以只需要列舉n的每一個因子x,然
hdu 2522 求1/n的迴圈節 小模擬 另外memset節省時間的特殊寫法
A simple problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2567 Accepte
求1~n的和
題目描述 實現1+2+3…+n,要求不能使用乘除法、迴圈、條件判斷、選擇相關的關鍵字。 思路 使用遞迴來解決這個問題 程式碼 #include <stdio.h> int add(int n,int& sum) {