1. 程式人生 > >擴充套件lucas學習筆記

擴充套件lucas學習筆記

胡思亂想

最後的沉淪??

用處

C n m m o d p C_n^m mod p

的結果,不保證 p p 為質數

水法

p p 分解質因數,可以知道
p

= p 1 k 1 p 2
k 2
. . . p n k n p=p1^{k1}*p2^{k2}*...*pn^{kn}
如果我們能知道
a n s a 1 ( m o d    p 1 k 1 ) ans\equiv a1(\mod p1^{k1})
a n s a 2 ( m o d    p 2 k 2 ) ans\equiv a2(\mod p2^{k2})
a n s a n ( m o d    p n k n ) ans\equiv an(\mod pn^{kn})
就可以同餘方程組合並了
於是現在你要求的就是 C n m m o d p k C_n^mmodp^k
如果我們能知道 n ! m o d p k n!modp^k m ! m o d p k m!modp^k ( n m ) ! m o d p k (n-m)!modp^k
顯然能通過逆元得到答案
舉例一個 n = 19 , p i = 3 , k = 2 n=19,pi=3,k=2
可以把他分組得到
( 1 2 3 4 5 . . . 19 ) (1*2*3*4*5*...*19)
= ( 1 2 4 5 7 8 10 11 13 14 16 17 19 ) 3 6 ( 1 2 3 4 5 6 ) =(1*2*4*5*7*8*10*11*13*14*16*17*19)*3^6*(1*2*3*4*5*6)
前面不包含pi的因子
後面又是一個階乘可以遞迴計算
第一部分發現他們關於 p k p^k 分組同餘
最後剩下一部分暴力算
複雜度上界是 p k p^k
然後就到最後求逆元的時候了
發現其實他們是不互質的,因為存在因子 p i pi
把三個階乘中因子 p i pi 全部去掉,因為是除法可以直接減掉最後再乘
然後求逆元即可

板子

bzoj2142

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#define LL long long
#define mp(x,y) make_pair(x,y)
using namespace std;
inline int read()
{
	int f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
inline void write(int x)
{
	if(!x){putchar('0');return ;}
	static int sta[20],top=0;
	while(x)sta[++top]=x%10,x/=10;
	while(top)putchar(sta[top--]+'0');
}
inline void pr1(int x){write(x);putchar(' ');}
inline void pr2(int x){write(x);putchar('\n');}
LL pow_mod(LL a,LL b,LL mod)
{
	LL ret=1;
	while(b)
	{
		if(b&1)ret=ret*a%mod;
		a=a*a%mod;b>>=1;
	}
	return ret;
}
LL exgcd(LL a,LL b,LL &x,LL &y)
{
	if(a==0)
	{
		x=0;y=1;
		return b;
	}
	else
	{
		LL tx,ty;
		LL d=exgcd(b%a,a,tx,ty);
		x=ty-(b/a)*tx;
		y=tx;
		return d;
	}
}
LL inv(LL A,LL mod)
{
	LL x,y,K=1;
	LL d=exgcd(A,mod,x,y);
	x=(x*(K/d)%(mod/d)+(mod/d))%(mod/d);
	return x;
}
LL solve(LL n,LL pi,LL mod)//非互質  mod=pi^k 
{
	if(!n)return 1;
	LL ret=1;
	for(int i=2;i<=mod;i++)if(i%pi)ret=ret*i%mod;
	ret=pow_mod(ret,n/mod,mod);
	for(int i=2;i<=n%mod;i++)if(i%pi)ret=ret*i%mod;
	return ret*solve(n/pi,pi,mod)%mod;//遞迴計算另外一個階乘pi^u*(1*2*3...) 
}
LL exlucas(LL n,LL m,LL pi,LL mod)
{
	if(m>n)return 0;
	LL a=solve(n,pi,mod),b=solve(m,pi,mod),c=solve(n-m,pi,mod);
	LL k=0;
	for(LL i=n;i;i/=pi)k+=i/pi;
	for(LL i=m;i;i/=pi)k-=i/pi;
	for(LL i=n-m;i;i/=pi)k-=i/pi;
	return a*inv(b,mod)%mod*inv(c,mod)%mod*pow_mod(pi,k,mod)%mod;
}
LL a1[100005],p1[100005],p2[100005],ln,P,n,m,temp;
LL query()
{
	if(ln==1)return a1[1];
	LL m1=p1[1],b1=a1[1],m2,b2;
	for(int i=2;i<=ln;i++)
	{
		m2=p1[i];b2=a1[i];
		LL A=m1,B=m2,K=b2-b1,x,y;
		LL d=exgcd(A,B,x,y);
		x=(x*(K/d)%(B/d)+(B/d))%(B/d);
		b1=m1*x+b1;m1=m1/d*m2;
	}
	return b1;
}
LL work(LL n,LL m)
{
	
            
           

相關推薦

擴充套件lucas學習筆記

胡思亂想 最後的沉淪?? 用處 求 C n m

Sping 原始碼深度解析——容器的功能擴充套件學習筆記

我為什麼 看的不夠遠,因為高度不夠! 學習和整理總結Spring容器的功能擴充套件,本文為學習筆記,其中有一些內容是自己的思考總結! 一、兩種Spring中bean載入的方式 第一種 # 第一種使用 BeanFactory 以及它預設的實

擴充套件BSGS 學習筆記

首先你在學擴充套件BSGS前需要先了解BSGS。如果你還不瞭解BSGS或者對BSGS有什麼疑問,可以看看我的BSGS講解,我覺得基本是全網最詳細的了。 我們知道,BSGS可以解決求ax=b(modp)ax=b(modp)的最小非負整數xx,它的應用條件是要求底

中國剩餘定理與擴充套件 Lucas定理與擴充套件 學習筆記

中國剩餘定理 問題 求同餘方程組 ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪x≡c1(modm1)x≡c2(modm2)x≡c3(modm3)...x≡ck(modmk){x≡c1(modm1)x≡c2(modm2)x≡c3(modm3)...x≡ck(modmk

ES6學習筆記----陣列的擴充套件

1、Array.from   應用兩類:類似於陣列的物件和可遍歷的的物件(包含Map和Set),只有轉換成真正的陣列,才可使用陣列的方法。      類比:...擴充套件運算子也可以使某些物件變成陣列 2、Array.of 主要彌補陣列建構函式Array(

csdn學習筆記:lua擴充套件c程式 c/c++訪問lua變數和函式

aa.lua teacher = "guilinwang"; org = "nzhsoft"; object = "lua"; age = 28; tab = { teacher = "guilinwang_tab", org = "nzhsoft_tab",

[學習分享] R語言擴充套件包dplyr筆記 (轉載)

 2014年剛到, 就在 Feedly 訂閱裡看到 RStudio Blog 介紹 dplyr 包已釋出 (Introducing dplyr), 此包將原本 plyr 包中的 ddply() 等函式進一步分

學習筆記 - 中國剩餘定理&擴充套件中國剩餘定理

中國剩餘定理&擴充套件中國剩餘定理 NOIP考完回機房填坑    ◌ 中國剩餘定理 處理一類相較擴充套件中國剩餘定理更特殊的問題:   在這裡要求 對於任意i,j(i≠j),gcd(mi,mj)=1 (就是互素) 不互素的話就只能用擴充套件

Spring Cloud學習筆記25——自動擴充套件

垂直擴充套件 水平擴充套件 自我註冊和自我發現 服務登錄檔 客戶端 微服務例項 按需擴充套件 自動擴充套件的意義 好處: 提高了高可用性和容錯能力 增加了可伸縮性 具有最佳使用率,並節約成本

[學習筆記]擴展LUCAS定理

bool ref eight tps pro 質因子 calc sign 之一 可以先做這個題[SDOI2010]古代豬文 此算法和LUCAS定理沒有半毛錢關系。 【模板】擴展盧卡斯 不保證P是質數。 $C_n^m=\frac{n!}{m!(n-m)!}$麻煩

odoo10學習筆記二:繼承(擴充套件)、模組資料

一:繼承 在不改變底層物件的時候新增新的功能——這是通過繼承機制來實現的,作為在現有物件之上的修改層,這些修改可以發生在所有級別:模型,檢視和業務邏輯。不是直接修改現有模組,而是建立一個新模組以新增預期的修改。 1:擴充套件模型 Odoo 模型存在 Python 的模組之外, 在中間登錄檔那裡

學習筆記13--DOM擴充套件

Selector API querySelector() 接受一個css選擇符,返回第一個匹配的元素 // 在整個文件範圍查詢 var divEl = document.querySelect

js學習筆記----JavaScript中DOM擴充套件的那些事

什麼都不說,先上總結的圖~ Selectors API(選擇符API) querySelector()方法 接收一個css選擇符,返回與該模式匹配的第一個元素,如果沒有找到匹配的元素,返回null. //取得 body 元素 var body = docume

ElasticSearch學習筆記之三十三 IK分詞器擴充套件字典及text全文型別資料分詞聚合查詢

ElasticSearch學習筆記之三十三 IK分詞器擴充套件字典及text全文型別資料分詞聚合查詢 專屬詞彙分詞失敗 擴充套件字典 檢視當前詞庫 自定義詞典 更新配置 再次檢視分詞 text全文型別資料分詞聚合

C#入門經典 學習筆記(九) 抽象類 密封類 靜態類 擴充套件方法

抽象類   抽象類是設計用來被繼承的。抽象類只能被用作其他類的基類。   不能建立抽象類的例項。   抽象類使用abstract修飾符宣告。   抽象類可以包含抽象成員或非抽象成員。抽象類的成員可以是抽

js-ES6學習筆記-函式的擴充套件

1、ES6函式引數的預設值,直接寫在引數定義的後面。引數變數是預設宣告的,所以不能用let或const再次宣告。 function Point(x = 0, y = 0) { this.x = x; this.y = y; } var p = new Point(); p //

Swift學習筆記-協議擴充套件

在Swift中進行面向物件程式設計時,儘量使用協議和泛型,而不是類繼承,因為過深的繼承層次很容易讓程式碼充滿難以理解的類。 協議擴充套件 前面我們介紹過了類的擴充套件,協議的擴充套件也是類似的,協議

Lucas定理學習筆記

Lucas定理: (nm)≡(⌊np⌋⌊mp⌋)×(n%pm%p)mod&ThinSpace;&ThinSpace;p{n\choose m}\equiv{\lfloor{\frac{n

Python資料結構與擴充套件庫(學習筆記

慕課學習筆記 目錄 1. 字典 字典更新: 字典刪除: 案例: 2. 集合 1. 字典 字典建立物件之間的對映關係 字典無序,

11.Laravel5學習筆記擴充套件 Validator 類

簡介 在 Laravel5 中,本身已經提供了豐富的驗證規則供我們使用,但是天下應用奇葩多,做為程式設計師你會發現永遠都有新的驗證規則誕生,光是組合已經拯救不了你的專案了。這個時候就需要我們擴充套件 Validator 類,來使之幫助專案繼續健康向前發展。