倍增或線段樹,給出乙個數,讓它模一連串的數

2022-05-01 01:48:12 字數 1595 閱讀 5129

題意:

給出一系列商品的**,下面再給出q個人瀏覽商品的起點到末尾,和他帶上的錢,如果看到能買的商品就買最多個,輸出每個人瀏覽後所剩餘的錢

分析:如果對於每個人都遍歷一遍的話,最壞的情況超過了1e9。

由於是取模運算,可以找到這個數列的第乙個比他小的數,模它,比它大則無視。乙個數最多模lgn下。

接下來最重要的是找到第乙個比v小的數的位置

用倍增的方法儲存一段數的最小值。

然後再以lgn的速度求出從a開始,比v小的第乙個數。

ac**1:倍增

#include using

namespace

std;

const

int maxn=200000+10

;#define ll long longll num[maxn];

ll min[maxn][

25];//

min[i][j]從第i個元素到i+2ej-1個元素的最小值

int fin(ll v,int

s) }

if(num[s]<=v)

return

s;

else

return

maxn;

}int

main()

for(int j=1;j<=20;j++)//

建立倍增陣列

for(int i=1;i<=n;i++)

for(int i=1;i<=q;i++)

printf(

"%i64d\n

",v);

}return0;

}

view code

ac**2 :線段樹

1 #include 2

using

namespace

std;

3#define ll long long

4const

int maxn=200000+10;5

struct

node

6node[maxn*4

];10

ll num[maxn];

11void build(int s,int o,int

xt)12

20 build(s,mid,xt*2

);21 build(mid+1,o,xt*2+1

);22 node[xt].min=min(node[xt*2].min,node[xt*2+1

].min);23}

24int getnext(ll v,int ss ,int

n)25

34if(node[xt].min<=v)

3543

return

node[xt].o;44}

45else

return getnext(v,node[xt].o+1

,n);46}

47int

main()

4864 printf("

%i64d\n

",v);65}

66return0;

67 }

view code

複習之求乙個數的約束之積模乙個質數

首先我們知道對於乙個數x,他的約數之積可以表示為f x x d x 2 其中d x 為x的約束的個數。當x很大的時候d x 會變的非常大,很難將確切的d x 算出來,費馬小定理告訴我們當p是質數的時候a p a mod p 當a與p互質的時候式子就變成了a p 1 1 mod p 通過這個我們可以對...

求乙個數的質因數(1個或n個)

在做 容斥原理 題時經常需要求出乙個數的質因子,而且不是所求數的位數很多,就是一次求n多數的質因子。下面分別給出兩種型別的 供拋磚引玉。第一種型別 用於每次只能求出乙個數的質因子,適用於題目中給的n的個數不是很多,但是n又特別大的情況。includeint main if n 1 應對 n 103 ...

給出乙個完全二叉樹,求出該樹的節點個數。

題目描述 完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2 h 個節點。輸入 1 2 3 4 5 6輸出 6例如此二叉樹 最低層沒有填滿,並且最下面一層的節點都集中...