1. 程式人生 > >Luogu4433:[COCI2009-2010#1] ALADIN(類歐幾里德演算法)

Luogu4433:[COCI2009-2010#1] ALADIN(類歐幾里德演算法)

先套用一個線段樹維護離散化之後的區間的每一段的答案
那麼只要考慮怎麼下面的東西即可
i = 1 n (

A × i   m o d   B )
\sum_{i=1}^{n}(A\times i \ mod \ B)
拆開就是
i = 1
n A × i B × i = 1 n A × i B \sum_{i=1}^{n}A\times i-B\times \sum_{i=1}^{n}\lfloor\frac{A\times i}{B}\rfloor

只要考慮計算 i = 1 n A × i B \sum_{i=1}^{n}\lfloor\frac{A\times i}{B}\rfloor 即可
類歐幾里德演算法
A > B A>B ,那麼就是
A B i = 1 n i + i = 1 n ( A   m o d   B ) × i B \lfloor\frac{A}{B}\rfloor\sum_{i=1}^{n}i+\sum_{i=1}^{n}\lfloor\frac{(A \ mod \ B)\times i}{B}\rfloor
變成 A < B A<B 的情況
對於 A < B A<B ,那麼可以看成是求直線 y = A B × i , i [ 1 , n ] y=\frac{A}{B}\times i,i\in[1,n] 與座標軸圍成的三角形中的整點的個數
m = A × n B m=\lfloor\frac{A\times n}{B}\rfloor
把問題為矩形 ( 0 , 0 ) , ( n , m ) (0,0),(n,m) 內的減去三角形 ( 0 , 0 ) , ( n , m ) , ( 0 , m ) (0,0),(n,m),(0,m) 內的再加上對角線的
對角線上的就是 n × g c d ( A , B ) B \frac{n\times gcd(A,B)}{B} ,矩形內的就是 n × m n\times m
對於那個三角形的,反轉座標系後相當於是求直線 y = B A × i , i [ 1 , A × n B ] y=\frac{B}{A}\times i,i\in[1,\lfloor\frac{A\times n}{B}\rfloor] 與座標軸圍成的三角形中的整點的個數

i = 1 A × n B B × i A \sum_{i=1}^{\lfloor\frac{A\times n}{B}\rfloor}\lfloor\frac{B\times i}{A}\rfloor
遞迴處理即可,複雜度和 g c d gcd 一樣
可以先把 A , B A,B 同時除去 g c d gcd 後再做
這個題注意一個細節
i = 1 n A × i B × i = 1 n A × i B \sum_{i=1}^{n}A\times i-B\times \sum_{i=1}^{n}\lfloor\frac{A\times i}{B}\rfloor
直接求的可能會爆 l o n g   l o n g long \ long
可以對 B B 分段,算出長度為 B B 的乘上 n B \lfloor\frac{n}{B}\rfloor ,再加上長度為 n   m o d   B n \ mod \ B 的,可以接受

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;

namespace IO {
	const int maxn(1 << 21 | 1);

	char ibuf[maxn], *iS, *iT, c;
	int f;

	inline char Getc() {
		return iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin), (iS == iT ? EOF : *iS++)) : *iS++;
	}

	template <class Int> inline void In(Int &x) {
		for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;
		for (x = 0; c >= '0' && c <= '9'; c = Getc()) x = (x << 1) + (x << 3) + (c ^ 48);
		x *= f;
	}
}

using IO :: In;

const int maxn(1e5 + 5);

int n, m, o[maxn], cnt;

struct Segment {
	ll sum;
	int a, b, l;
} tr[maxn << 2];

inline void Update(int x) {
	tr[x].sum = tr[x << 1].sum + tr[x << 1 | 1].sum;
}

inline int Gcd(int a, int b) {
	return !b ? a : Gcd(b, a % b);
}

inline ll Mul(
            
           

相關推薦

Luogu4433[COCI2009-2010#1] ALADIN(演算法)

先套用一個線段樹維護離散化之後的區間的每一段的答案 那麼只要考慮怎麼下面的東西即可 ∑

Luogu4433[COCI2009-2010#1] ALADIN(算法)

pac void lld con isp urn 同時 long 復雜度 先套用一個線段樹維護離散化之後的區間的每一段的答案 那麽只要考慮怎麽下面的東西即可 \[\sum_{i=1}^{n}(A\times i \ mod \ B)\] 拆開就是 \[\sum_{i=1}^

bzoj2987 Earthquake 演算法

題目要求的其實是合法解數量 ax+by<=c (c-ax)/b=y; 那麼這是經典的類歐模型,直接做就好了。 有人會問有負數怎麼辦? 。。 (c-ax)=(c%a+ax),因為在模A意

[BZOJ2987]Earthquake演算法

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

證明

類歐幾里德 一道求g裸題的程式碼 In 2 4 3 1 3 輸入a c b l r樣例是求i由1~3求和i*[(2i+3)/4]向下取整 Out 9 輸出1[(21+3)/4]+2[(22+3)/4]+ 3[(2*3+3)/4]=1+2+6=9 #include <bits

類歐幾里德 bzoj 2187: fraction 類歐幾里德演算法 題意:給你4個正整數a,b,c,d,求一個最簡分數 p / q滿足 a / b < p / q < c / d,若有多組解,輸出q最小的一組,若仍有多組解,輸出p最小的一組。 #include<bit

[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

演算法與推導

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

演算法亂搞記

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

演算法(部分)

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<&

同餘方程(擴充套件演算法

同餘方程 時間限制: 1 Sec  記憶體限制: 128 MB 題目描述 求關於 x 的同餘方程 ax ≡ 1 (mod b)的最小正整數解。 輸入 輸入只有一行,包含兩個正整數 a, b,用一個空格隔開。 輸出 輸出只有一行,包含

caioj 1153 擴充套件演算法(解不定方程)

模板題 注意exgcd函式要稍微記一下 #include<cstdio> #include<cctype> #include<algorithm> #define

擴充套件的演算法-HDU2669

The Sky is Sprite.  The Birds is Fly in the Sky.  The Wind is Wonderful.  Blew Throw the Trees  Trees are Shaking, Leaves are Fal

數論-擴充套件演算法

找出一對整數(x,y),使得ax+by=gcd(a,b)。注意,這裡的x和y不一定是正數,也可能是負數或者0.例如,gcd(6,15)=3,6*3-15*1=3,其中,x=3,y=-1.這個方程還有其他解,如x=-2,y=1。 用數學歸納法並不難證明演算法的正確性。此處略去

演算法學習(一)——演算法&擴充套件演算法

最大公約數/歐幾里德演算法(gcd) 歐幾里德演算法又稱輾轉相除法,證明可以度娘。 個人簡單腦部就是a和b兩個數的模還是a和b的最大公約數 int型別  int gcd(int a, int b) {return a%b==0?b:gcd(b,a%b);} long l

拓展演算法的求解證明及基本應用

拓展歐幾里德要解決的問題就是給定方程 a x +