1. 程式人生 > >類歐幾里得演算法亂搞記

類歐幾里得演算法亂搞記

這三個f,g,h讓我的腦子快要爆炸,還是終於推了出來,記錄一下。

記得初一的時候就無意間在ZJY的PPT翻到了這個東西,當時和WYT推了一波,到現在連個印象都沒有。

據說有幾何推法,我這麼渣肯定是不會的了。

定義:

f(a,b,c,n)=ni=0ai+bc
g(a,b,c,n)=ni=0iai+bc
h(a,b,c,n)=ni=0ai+bc2

f的推導:

a=amodc,b=bmodc

f(a,b,c,n)=ni=0ai+bc+aci+bc
=f(a,b,c,n)+n(n+1)/2ac+(n+1)bc

進過上面這個調整後可以使a

,b<c,這也是為什麼它叫類歐幾里得演算法的原因,從最終的式子可以看出來這點。

m=an+bc

f(a,b,c,n)
=ni=0ai+bc
=mj=1ni=0[ai+bc>=j]
=m1j=0ni=0[ai+bc>=j+1]
=m1j=0ni=0[ai>=jc+cb]
=m1j=0ni=0[ai>jc+cb1]
=m1j=0ni=0[i>jc+cb1a]
=m1j=0njc

相關推薦

演算法

這三個f,g,h讓我的腦子快要爆炸,還是終於推了出來,記錄一下。 記得初一的時候就無意間在ZJY的PPT翻到了這個東西,當時和WYT推了一波,到現在連個印象都沒有。 據說有幾何推法,我這麼渣肯定是不會的了。 定義: f(a,b,c,n)=∑n

[51nod1187][演算法]尋找分數

Description 給出 a,b,c,d, 找一個分數p/q,使得a/b < p/q < c/d,並且q最小。例如:1/3同1/2之間,符合條件且分母最小的分數是2/5。(如果q相同,

【LOJ】#138. 演算法

傳送門:loj138 題解 被標題坑進去,斷斷續續做了一天。。。確實是“類歐幾里得演算法”啊(霧。。。 原題解-fjzzq2002 設答案為函式 f

[BZOJ2987]Earthquake:演算法

分析 類歐的式子到底是誰推的啊怎麼這麼神仙啊orz! 簡單說一下這道題,題目中的約束條件可以轉化為: \[ y \leq \frac{c-ax}{b} \] 有負數怎麼辦啊?轉化一下: \[ y \leq \frac{ax+c\%a}{b} \] 唔姆,好像差不多。 列舉\(x\),可以看成那個

演算法與推導

總起 類歐幾里得主要是模仿歐幾里得函式的過程,求解一些問題,時間複雜度與歐幾里得一致。 我們這裡主要是要多弄一個j,然後和i交換主體,再把i消去,達到轉移為新狀態的目的。 程式碼 目前懶得寫,反正式子是推兩次了,很正確 題目 [JZO

演算法(部分)

Preface 歐幾里得演算法,就是輾轉相除法。 gcd(i,j)=gcd(j,i%j) 定義 定義函式 F(a,b,c,n)=∑i=0n⌊ai+bc⌋ 推導一波 顯然當a≥c或者b≥c時,F(a,b,c,n)=∑i=0n(⌊(amodc)i+(b

bzoj2712 -- 演算法

與bzoj2187類似,不過是要先將小數轉化成四捨五入前的分數 程式碼: 1 #include<cstdio> 2 #include<cstring> 3 #inclu

JZOJ5243【GDOI2018模擬8.8】超級綿羊異或 演算法

好像沒什麼人去改這題啊。。。 題意:求axor(a+b)xor(a+b∗2).....xor(a+b∗(n−1)) 考慮計算答案的第x位是否為1 那麼對於a+bi,判斷(a+bi)/(1<&

bzoj 1938 - +線段樹

題目連結:https://darkbzoj.cf/problem/1938   解題思路; 對於區間更新: 前半部分可以用線段樹求等差數列和,後半部分可以用類歐幾里得演算法求出值 類歐幾里得 然後是要對區間離散化,其中有個問題在於對於區間(l,r)分裂為(

同餘定理(演算法

如果  (a-b)%m==0  那麼 a%m==0  b%m==0 a,b關於模m同餘。   求最大公約數 #include "pch.h" #include<iostream> #include<cstdio> #include<

演算法 2018-10-18

歐幾里得演算法就是輾轉相除。 歐幾里得演算法和輾轉相除法都是求兩數最小公倍數的演算法。 所以,歐幾里得演算法(輾轉相除法)的重要程式碼如下: int gcd(int x,int y){ if(y==0) return x; else return gcd(y

UVA - 12169 -擴充套件演算法

#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #define ll long long #define rep(i,j,k) for(int i=j;

演算法(輾轉相除法)求最大公約數程式碼

    求解最大公約數依據如下定理:gcd(a,b) = gcd(b,a mod b) (不妨設a>b 且r=a mod b ,r不為0); 兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數。 程式碼: 非遞迴演算法: int gcd(in

演算法複習——擴充套件演算法(擴充套件,逆元,整除)

①歐幾里得演算法 就是求gcd的有趣的輾轉相除法,不再贅述啦0v0 程式碼: int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } ②擴充套件歐幾里得演算法 需要解決這樣的問題:兩個非0整數a,b

奧賽-演算法-最大公約數

Greatest Common Divisor(GCD) 歐幾里得演算法據說是最早的演算法,用於計算最大公約數,也是數論的基礎演算法之一。   1.歐幾里德演算法的思想: 歐幾里德演算法的思想基於輾轉相除法的原理,輾轉相除法是歐幾里德演算法的核心思想,歐幾里德演算法說白了其實就是輾轉相除法的

實驗二 擴充套件演算法c++程式碼

#include<iostream> #include<stdio.h> using namespace std; int x,y,q; void extend_Eulid(int a,int b) { if(b==0) { x=1; y=0; q=a; }

【擴充套件演算法】輾轉相除法

其計算原理依賴於下面的定理: 定理:兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數。最大公約數(Greatest Common Divisor)縮寫為GCD。 /* 歐幾里德演算法:輾轉求餘 原理: gcd(a,b)=gcd(b,a mod b) 當b為0時,兩數的最

拓展演算法模板

程式碼示例:求出ax + by = c的所有解 #include<cstdio> int exgcd(int a,int b,int& x,int& y){ if(b == 0){ x = 1,y = 0; return a; } int d = e

擴充套件演算法+獲取特殊的解

通過擴充套件歐幾里得演算法獲取x或者y的最小整數解 template<class T> void exgcd(T a,T b,T &d,T &x,T &y){ if(!b) {d=a;x=1;y=0;} else {exgcd(b,a%b,d,y,x

POJ-1061-青蛙的約會 (擴充套件演算法

原題連結: http://poj.org/problem?id=1061 兩隻青蛙在網上相識了,它們聊得很開心,於是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,於是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特徵,也沒有約定