Nhảy chuyển đến

Nhanh chóng mịch

Định nghĩa

Nhanh chóng mịch, cơ số hai lấy mịch ( Binary Exponentiation, cũng xưng bình phương pháp ), là một cái ởThời gian nội tính toánTiểu kỹ xảo, mà bạo lực tính toán yêu cầuThời gian.

Cái này kỹ xảo cũng thường thường dùng ở phi tính toán cảnh tượng, bởi vì nó có thể ứng dụng ở bất luận cái gì có kết hợp luật giải toán trung. Trong đó hiển nhiên chính là nó có thể ứng dụng với mô ý nghĩa hạ lấy mịch, Ma trận mịch chờ giải toán, chúng ta kế tiếp sẽ thảo luận.

Giải thích

Tính toánThứ phương tỏ vẻ đemCáiThừa ở bên nhau:Cái.Nhưng mà đươngQuá lớn khi hầu, loại này phương pháp liền không quá áp dụng. Bất quá chúng ta biết:.Cơ số hai lấy mịch ý tưởng là, chúng ta đem lấy mịch nhiệm vụ dựa theo chỉ sốCơ số hai tỏ vẻTới phân cách thành càng tiểu nhân nhiệm vụ.

Quá trình

Thay đổi phiên bản

Đầu tiên chúng ta đemTỏ vẻ vì 2 tiến chế, cử một ví dụ:

Bởi vìCái cơ số hai vị, bởi vậy khi chúng ta đã biếtSau, chúng ta chỉ dùng tính toánThứ phép nhân liền có thể tính toán ra.

Vì thế chúng ta chỉ cần biết một cái nhanh chóng phương pháp tới tính toán kể trên 3Thứ mịch danh sách. Vấn đề này rất đơn giản, bởi vì danh sách trung ( trừ cái thứ nhất ) tùy ý một cái nguyên tố chính là này trước một cái nguyên tố bình phương. Cử một ví dụ:

Bởi vậy vì tính toán,Chúng ta chỉ cần đem đối ứng cơ số hai vị vì 1 chỉnh hệ số mịch thừa lên là được:

Đem kể trên quá trình nói được hình thức hóa một ít, nếu đemViết làm cơ số hai vì,Như vậy có:

Trong đó.Như vậy liền có

Căn cứ thượng thức chúng ta phát hiện, nguyên vấn đề bị chúng ta chuyển hóa thành hình thức tương đồng tử vấn đề tích số, hơn nữa chúng ta có thể ở hằng số thời gian nội từHạng đẩy raHạng.

Cái này thuật toán phức tạp độ là,Chúng ta tính toánCáiThứ mịch số, sau đó tiêu phíThời gian lựa chọn cơ số hai vì 1 đối ứng mịch tới tương thừa.

Đệ quy phiên bản

Kể trên thay đổi phiên bản trung, bởi vìHạng ỷ lại với,Khiến cho này thay đổi vì đệ quy phiên bản tương đối khó khăn ( một phương diện yêu cầu phản hồi một cái thêm vào,Đối hàm số tới nói vô pháp thực hiện một cái chỉ phản hồi tính toán kết quả tiếp lời; về phương diện khác còn lại là cần thiết từ thấp vị hướng địa vị cao tính toán, tức từ địa vị cao hướng thấp vị thuyên chuyển, này cũng tạo thành đệ quy thực hiện bối rối ), phía dưới tắc cung cấp đệ quy phiên bản ý nghĩ.

Cấp định hình thức,TứcTỏ vẻ đemTrướcVị cơ số hai vị làm như một cái cơ số hai số, tắc giống như hạ biến hóa:

Như vậy có:

Như trên sở thuật, ở đệ quy khi, đối với bất đồng đệ quy chiều sâu là tương đồng xử lý:,Sắp trước mặt đệ quy cơ số hai số hủy đi thành hai bộ phận: Thấp nhất vị ở đệ quy ra tới khi thừa đi lên, còn lại bộ phận tắc biến thành tân cơ số hai số đệ quy tiến vào càng sâu một tầng làm tương đồng xử lý.

Có thể quan sát đến, mỗi đệ quy thâm nhập một tầng tắc cơ số hai vị giảm bớt một vị, cho nên nên thuật toán thời gian phức tạp độ cũng vì.

Thực hiện

Đầu tiên chúng ta có thể trực tiếp dựa theo kể trên đệ quy phương pháp thực hiện:

1
2
3
4
5
6
7
8
longlongbinpow(longlonga,longlongb){
if(b==0)return1;
longlongres=binpow(a,b/2);
if(b%2)
returnres*res*a;
else
returnres*res;
}
1
2
3
4
5
6
7
8
defbinpow(a,b):
ifb==0:
return1
res=binpow(a,b//2)
if(b%2)==1:
returnres*res*a
else:
returnres*res

Đệ nhị loại thực hiện phương pháp thị phi đệ quy thức. Nó ở tuần hoàn trong quá trình đem cơ số hai vị vì 1 khi đối ứng mịch mệt thừa đến đáp án trung. Cứ việc hai người lý luận phức tạp độ là tương đồng, nhưng đệ nhị loại ở thực tiễn trong quá trình tốc độ là so đệ nhất loại càng mau, bởi vì đệ quy sẽ tiêu phí nhất định chi tiêu.

1
2
3
4
5
6
7
8
9
longlongbinpow(longlonga,longlongb){
longlongres=1;
while(b>0){
if(b&1)res=res*a;
a=a*a;
b>>=1;
}
returnres;
}
1
2
3
4
5
6
7
8
defbinpow(a,b):
res=1
whileb>0:
ifb&1:
res=res*a
a=a*a
b>>=1
returnres

Khuôn mẫu:Luogu P1226

Ứng dụng

Mô ý nghĩa hạ lấy mịch

Vấn đề miêu tả

Tính toán.

Đây là một cái phi thường thường thấy ứng dụng, tỷ như nó có thể dùng cho tính toán mô ý nghĩa hạ phép nhân nghịch nguyên.

Nếu chúng ta biết lấy mô giải toán sẽ không can thiệp phép nhân giải toán, bởi vậy chúng ta chỉ cần ở tính toán trong quá trình lấy mô là được.

1
2
3
4
5
6
7
8
9
10
longlongbinpow(longlonga,longlongb,longlongm){
a%=m;
longlongres=1;
while(b>0){
if(b&1)res=res*a%m;
a=a*a%m;
b>>=1;
}
returnres;
}
1
2
3
4
5
6
7
8
9
defbinpow(a,b,m):
a=a%m
res=1
whileb>0:
ifb&1:
res=res*a%m
a=a*a%m
b>>=1
returnres

Chú ý: Căn cứ phí mã tiểu định lý, nếuLà một cái số nguyên tố, chúng ta có thể tính toánTới gia tốc thuật toán quá trình.

Tính toán Fibonacci số

Vấn đề miêu tả

Tính toán dãy Fibonacci đệHạng.

Căn cứ dãy Fibonacci đệ đẩy thức,Chúng ta có thể xây dựng một cáiMa trận tới tỏ vẻ từĐếnBiến hóa. Vì thế ở tính toán cái này Ma trậnThứ mịch khi hầu, chúng ta sử dụng nhanh chóng mịch tư tưởng, có thể ởThời gian nội tính toán ra kết quả. Đối với càng nhiều chi tiết tham kiếnDãy Fibonacci,Ma trận nhanh chóng mịch thực hiện tham kiếnMa trận gia tốc đệ đẩyTrung thực hiện.

Nhiều lần đổi thành

Vấn đề miêu tả

Cho ngươi một cái chiều dài vìDanh sách cùng một cái đổi thành, đem cái này danh sách đổi thànhThứ.

Đơn giản mà đem cái này đổi thành lấyThứ mịch, sau đó đem nó ứng dụng đến danh sáchThượng là được. Thời gian phức tạp độ là.

Chú ý: Cấp cái này đổi thành kiến đồ, sau đó ở mỗi một cái hoàn thượng phân biệt làmThứ mịch ( trên thực tế làm một chútĐối hoàn trường lấy mô giải toán có thể ) có thể lấy được càng cao hiệu thuật toán, đạt tớiPhức tạp độ.

Gia tốc bao nhiêu trung đối điểm tập thao tác

Dẫn vào

Không gian ba chiều trung,Cái điểm,Yêu cầu đemCái thao tác đều ứng dụng với này đó điểm. Bao hàm 3 loại thao tác:

  1. Duyên nào đó vector di động điểm vị trí ( Shift ).
  2. Ấn tỉ lệ súc phóng cái này điểm tọa độ ( Scale ).
  3. Vòng nào đó trục toạ độ xoay tròn ( Rotate ).

Còn có một cái đặc thù thao tác, chính là đem một cái thao tác danh sách lặp lạiThứ ( Loop ), cái này danh sách trung cũng có thể có Loop thao tác ( Loop thao tác có thể khảm bộ ). Hiện tại yêu cầu ngươi ở thấp hơnThời gian nội đem này đó biến hóa ứng dụng đến cái nàyCái điểm, trong đóTỏ vẻ đem sở hữu Loop thao tác triển khai sau thao tác danh sách chiều dài.

Giải thích

Làm chúng ta tới quan sát một chút này ba loại thao tác ngồi đối diện bia ảnh hưởng:

  1. Shift thao tác: Đem mỗi một duy tọa độ phân biệt hơn nữa một cái đại lượng không đổi;
  2. Scale thao tác: Đem mỗi một duy tọa độ phân biệt thừa thượng một cái đại lượng không đổi;
  3. Rotate thao tác: Cái này có điểm phức tạp, chúng ta không tính toán thâm nhập tìm tòi nghiên cứu, bất quá chúng ta vẫn cứ có thể sử dụng một cái tuyến tính tổ hợp tới tỏ vẻ tân tọa độ.

Có thể nhìn đến, mỗi một cái biến hóa có thể bị tỏ vẻ vì ngồi đối diện bia tuyến tính giải toán, bởi vậy, một cái biến hóa có thể dùng một cáiMa trận tới tỏ vẻ:

Sử dụng cái này Ma trận liền có thể đem một cái tọa độ ( vector ) tiến hành biến hóa, được đến tân tọa độ ( vector ):

Ngươi khả năng sẽ hỏi, vì cái gì một cái 3d tọa độ sẽ thêm một cái 1 ra tới? Nguyên nhân ở chỗ, nếu không có cái này nhiều ra tới 1, chúng ta vô pháp sử dụng Ma trận tuyến tính biến hóa tới miêu tả Shift thao tác.

Quá trình

Kế tiếp cử một ít đơn giản ví dụ tới thuyết minh chúng ta ý nghĩ:

  1. Shift thao tác: LàmTọa độ phương hướng di chuyển vị trí vì,Tọa độ di chuyển vị trí vì,Tọa độ di chuyển vị trí vì:

  2. Scale thao tác: ĐemTọa độ kéo duỗi 10 lần,Tọa độ kéo duỗi 5 lần:

  3. Rotate thao tác: VòngTrục xoay trònĐộ cung, tuần hoàn tay phải luật ( nghịch kim đồng hồ phương hướng )

Hiện tại, mỗi một loại thao tác đều bị tỏ vẻ vì một cái Ma trận, biến hóa danh sách có thể dùng Ma trận tích số tới tỏ vẻ, mà một cái Loop thao tác tương đương với lấy một cái Ma trận k thứ mịch. Như vậy có thể dùngTính toán ra toàn bộ biến hóa danh sách cuối cùng hình thành Ma trận. Cuối cùng đem nó ứng dụng đếnCái điểm thượng, tổng phức tạp độ.

Định trường đường nhỏ đếm hết

Vấn đề miêu tả

Cấp một cái có hướng đồ ( biên quyền vì 1 ), cầu tùy ý hai điểmGian từĐến,Chiều dài vìĐường nhỏ điều số.

Chúng ta đem nên đồ sát nhau Ma trận M lấy k thứ mịch, như vậyLiền tỏ vẻ từĐếnChiều dài vìĐường nhỏ số lượng. Nên thuật toán phức tạp độ là.Có quan hệ nên thuật toán chi tiết thỉnh tham kiếnMa trậnGiao diện.

Mô ý nghĩa hạ đại số nguyên phép nhân

Tính toán.

Cùng cơ số hai lấy mịch tư tưởng giống nhau, lần này chúng ta đem trong đó một cái số nhân tỏ vẻ vì bao nhiêu cái 2 số nguyên thứ mịch cùng hình thức. Bởi vì ở đối một số làm thừa 2 cũng lấy mô giải toán khi hầu, chúng ta có thể chuyển hóa vì thêm giảm thao tác phòng ngừa tràn ra. Như vậy vẫn có thể ởKhi nội giải quyết vấn đề. Đệ quy phương pháp như sau:

Nhanh chóng thừa

Nhưng là“Quy tốc thừa” vẫn là quá chậm, này ở rất nhiều đối hằng số yêu cầu tương đối cao thuật toán tỷ như Miller_Rabin cùng Pollard-Rho trung, liền có vẻ không đủ dùng. Cho nên chúng ta muốn giới thiệu một loại có thể xử lý mô số ởlong longTrong phạm vi, không cần sử dụng công nghệ đen__int128,Phức tạp độ vì“Nhanh chóng thừa”.

Chúng ta phát hiện:

Chúng ta xảo diệu vận dụngunsigned long longTự nhiên tràn ra:

Vì thế ở tính raSau, hai bên phép nhân cùng trung gian phép trừ bộ phận đều có thể sử dụngunsigned long longTrực tiếp tính toán, hiện tại chúng ta chỉ cần giải quyết như thế nào tính toán.

Chúng ta suy xét trước sử dụnglong doubleTính raLại thừa thượng.

Nếu sử dụnglong double,Liền không thể nghi ngờ sẽ có độ chặt chẽ khác biệt. Cực đoan tình huống chính là cái thứ nhất hữu hiệu con số ( cơ số hai hạ ) ở số lẻ sau một vị. Ởx86-64Máy móc hạ,long doubleĐem bị giải thích thànhVị mở rộng số nhỏ ( tức ký hiệu vìVị, chỉ số vìVị, số đuôi vìVị ), cho nênlong doubleNhiều nhất có thể chính xác tỏ vẻ hữu hiệu vị số vì1.Cho nênKém cỏi nhất từ đệVị bắt đầu làm lỗi, khác biệt phạm vi vì.Thừa thượngCái nàyVị số nguyên, khác biệt phạm vi vì,Hơn nữaKhác biệt phạm vi vì,Lấy chỉnh sau khác biệt phạm vi vị.Vì thế thừa thượngSau, khác biệt phạm vi biến thành,Chúng ta yêu cầu phán đoán này hai loại tình huống.

Bởi vìlong longTrong phạm vi, cho nên nếu tính toán kết quảKhi, trực tiếp phản hồi,Nếu không phản hồi,Đương nhiên ngươi cũng có thể trực tiếp phản hồi.

Số hiệu thực hiện như sau:

1
2
3
4
5
6
7
longlongbinmul(longlonga,longlongb,longlongm){
unsignedlonglongc=
(unsignedlonglong)a*b-
(unsignedlonglong)((longdouble)a/m*b+0.5L)*m;
if(cm)returnc;
returnc+m;
}

Cao độ chặt chẽ nhanh chóng mịch

Trước trí kỹ năng

Thỉnh trước học tậpCao độ chặt chẽ

Ví dụ mẫu 【NOIP2003 phổ cập tổ cải biên · mạch sâm số 】 (Nguyên đề tại đây)

Đề mục đại ý: Từ văn kiện trung đưa vào(), tính toánCuối cùng 100 vị con số ( dùng số thập phân cao độ chặt chẽ số tỏ vẻ ), không đủ 100 vị khi địa vị cao bổ 0.

Số hiệu thực hiện như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include&LTcstring>
#include&LTiostream>
usingnamespacestd;
inta[505],b[505],t[505],i,j;

voidmult(intx[],inty[])// cao độ chặt chẽ phép nhân
{
memset(t,0,sizeof(t));
for(i=1;ix[0];i++){
for(j=1;jy[0];j++){
if(i+j-1>100)continue;
t[i+j-1]+=x[i]*y[j];
t[i+j]+=t[i+j-1]/10;
t[i+j-1]%=10;
t[0]=i+j;
}
}
memcpy(b,t,sizeof(b));
}

voidksm(intp)// nhanh chóng mịch
{
if(p==1){
memcpy(b,a,sizeof(b));
return;
}
ksm(p/2);//(2^(p/2))^2=2^p
mult(b,b);// đối b bình phương
if(p%2==1)mult(b,a);
}

intmain(){
cin.tie(nullptr)->sync_with_stdio(false);
intp;
cin>>p;
a[0]=1;// ký lục a số tổ vị số
a[1]=2;// đối 2 tiến hành bình phương
b[0]=1;// ký lục b số tổ vị số
b[1]=1;// đáp án số tổ
ksm(p);
for(i=100;i>=1;i--){
if(i==1){
coutb[i]-1'\n';// cuối cùng một vị giảm 1
}else
coutb[i];
}
}

Cùng cơ số cùng cùng mô số dự xử lý nhanh chóng mịch

Ở cùng cơ số cùng cùng mô số điều kiện hạ, có thể lợi dụng phân khối tư tưởng, dùng nhất định thời gian ( giống nhau là) dự xử lý sử dụng sau nàyThời gian trả lời một lần mịch dò hỏi.

Quá trình

  1. Tuyển định một số,Dự xử lý raĐếnCùngĐếnGiá trị cùng tồn tại ở một cái ( hoặc hai cái ) số tổ;
  2. Đối với mỗi một lần dò hỏi,ĐemTách ra thành,Tắc,Có thểCầu ra đáp án.

Về cái này sốLựa chọn, chúng ta giống nhau lựa chọnHoặc là một cái lớn nhỏ thích hợpThứ mịch ( lựa chọnCó thể sử dự xử lý so ưu, lựa chọnThứ mịch có thể sử dụng vị giải toán ưu hoá / đơn giản hoá tính toán ).

Tham khảo số hiệu
1
2
3
4
5
6
7
8
9
10
intpow1[65536],pow2[65536];

voidpreproc(inta,intmod){
pow1[0]=pow2[0]=1;
for(inti=1;i65536;i++)pow1[i]=1LL*pow1[i-1]*a%mod;
intpow65536=1LL*pow1[65535]*a%mod;
for(inti=1;i65536;i++)pow2[i]=1LL*pow2[i-1]*pow65536%mod;
}

intquery(intpows){return1LL*pow1[pows&65535]*pow2[pows>>16];}

Bài tập

Bổn giao diện bộ phận nội dung dịch tự bác vănБинарное возведение в степеньCùng với tiếng Anh phiên dịch bảnBinary Exponentiation.Trong đó tiếng Nga bản bản quyền hiệp nghị vì Public Domain + Leave a Link; tiếng Anh bản bản quyền hiệp nghị vì CC-BY-SA 4.0.

Tham khảo tư liệu cùng chú thích