題意:
給出一系列商品的**,下面再給出q個人瀏覽商品的起點到末尾,和他帶上的錢,如果看到能買的商品就買最多個,輸出每個人瀏覽後所剩餘的錢
分析:如果對於每個人都遍歷一遍的話,最壞的情況超過了1e9。
由於是取模運算,可以找到這個數列的第乙個比他小的數,模它,比它大則無視。乙個數最多模lgn下。
接下來最重要的是找到第乙個比v小的數的位置
用倍增的方法儲存一段數的最小值。
然後再以lgn的速度求出從a開始,比v小的第乙個數。
ac**1:倍增
#include usingview codenamespace
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;
}
ac**2 :線段樹
1 #include 2view codeusing
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 }
複習之求乙個數的約束之積模乙個質數
首先我們知道對於乙個數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例如此二叉樹 最低層沒有填滿,並且最下面一層的節點都集中...