这里有一个公式:$\sqrt\frac{2}{3}\lim_{x\to \infty}{\frac{x}{e^x}=0}$
这里有一段代码
#include <con> #include <iostream> #include <set> int main() { std::set<int> s; for (int i=1;i<=1000;i++) s.insert(i*i%1234); for (auto i:s) std::cout<<i<<std::endl; return 0; }
这里有一个表格:
| 算法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 冒泡排序 | $O(n^2)$ | $O(1)$ |
| 堆排序 | $O(nlogn)$ | $O(1)$ |
#include<cstdio> #include<map> #include<vector> #include<cstring> #include<algorithm> #define _for(i,a,b) for(int i=(a);i<(b);i++) #define _rep(i,a,b) for(int i=(a);i⇐(b);i++) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long LL; typedef vector<int>::iterator iter; int read_int(){
int t;
scanf("%d",&t);
return t;
} void space(LL x){
printf("%lld ",x);
} void enter(LL x){
printf("%lld\n",x);
} const int MAXN=1e5+5; namespace Tree{
int init_val;
int lef[MAXN<<2],rig[MAXN<<2],maxv[MAXN<<2],maxc[MAXN<<2],secv[MAXN<<2],lazy[MAXN<<2];
LL sum[MAXN<<2];
void push_up(int k) {
sum[k]=(sum[k<<1]+sum[k<<1|1]);
if(maxv[k<<1]==maxv[k<<1|1]) {
maxv[k]=maxv[k<<1];
maxc[k]=maxc[k<<1]+maxc[k<<1|1];
secv[k]=max(secv[k<<1],secv[k<<1|1]);
}
else if(maxv[k<<1]>maxv[k<<1|1]) {
maxv[k]=maxv[k<<1];
maxc[k]=maxc[k<<1];
secv[k]=max(secv[k<<1],maxv[k<<1|1]);
}else {
maxv[k]=maxv[k<<1|1];
maxc[k]=maxc[k<<1|1];
secv[k]=max(maxv[k<<1],secv[k<<1|1]);
}
}
void push_tag(int k,int v) {
if(v>=maxv[k]) return;
sum[k]-=1LL*maxc[k]*(maxv[k]-v);
maxv[k]=lazy[k]=v;
}
void push_down(int k) {
if(~lazy[k]) {
push_tag(k<<1,lazy[k]);
push_tag(k<<1|1,lazy[k]);
lazy[k]=-1;
}
}
void build(int k,int L,int R) {
lef[k]=L,rig[k]=R,lazy[k]=-1;
int M=L+R>>1;
if(L==R) {
sum[k]=maxv[k]=init_val;
secv[k]=-1;
maxc[k]=1;
return;
}
build(k<<1,L,M);
build(k<<1|1,M+1,R);
push_up(k);
}
void init(int n){
init_val=n;
build(1,1,n);
}
void update(int k,int L,int R,int v) {
if(maxv[k]<=v) return;
if(L<=lef[k]&&rig[k]<=R&&secv[k]<v) {
return push_tag(k,v);
}
push_down(k);
int mid=lef[k]+rig[k]>>1;
if(mid>=L) update(k<<1,L,R,v);
if(mid<R) update(k<<1|1,L,R,v);
push_up(k);
}
} int p[MAXN]; LL f[MAXN]; vector<int> vec[MAXN]; void solve(){
int n=read_int();
_rep(i,1,n)
p[read_int()]=i;
_rep(i,1,n){
vec[i].clear();
vec[i].push_back(0);
for(int j=i;j<=n;j+=i)
vec[i].push_back(p[j]);
sort(vec[i].begin(),vec[i].end());
}
Tree::init(n);
for(int i=n;i;i--){
for(int j=0;j+2<vec[i].size();j++)
Tree::update(1,vec[i][j]+1,vec[i][j+1],vec[i][j+2]-1);
f[i]=1LL*n*n-Tree::sum[1];
}
f[n+1]=0;
_rep(i,1,n)
enter(f[i]-f[i+1]);
} int main(){ freopen(“test.in”,“r”,stdin); int T=read_int(); while(T–){ solve(); } return 0; }