12.23模拟赛
T1
正解:莫反推导出来的整除分块,证明不会:
然后直接快速幂来算是 的,过不了剩下三个点。考虑到模数很小且为质数,用费马小定理预处理幂次然后去算,复杂度 ,注意字符串处理 。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1145140,M=1919810,mod=10007;
ll n,m,num[N];
ll qpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
ll ans=0,l=1,r;
int main(){
//ios::sync_with_stdio(0);
//cin.tie(0); cout.tie(0);
char c;
while((c=getchar())!=' ') n=(n*10+c-'0')%(mod-1);
cin>>m;
for(int i=0;i<mod;++i) num[i]=qpow(i,n);
for( ;l<=m; ){
//cout<<"QWQ";
r=m/(m/l);
ans+=num[m/l%mod]*(r-l+1)%mod;
ans%=mod;
l=r+1;
}
cout<<ans%mod;
return 0;
}
T2
贪心假了,还忘记输出小数点了,宝玲。看不懂题解。
T3
正解树套树,wyc用分块切了,强。
麻了我这写得应该是对的啊,为啥一直RE?不管了先放这里,顺便搞到了第 4e4 条评测。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define in inline
const ll N=100010,M=30010;
ll MIN(ll a,ll b){return a<=b?a:b;}
ll sub,n,k,Q,o,las;
ll a[N],v[N],lg[N],val[N];
ll stmax[N][22],stmin[N][22];
ll bel[M],st[M],ed[M],siz[M],nq,ns;
ll query_max(ll l,ll r){
ll k=lg[r-l+1];
return max(stmax[l][k],stmax[r-(1<<k)+1][k]);
}
ll query_min(ll l,ll r){
ll k=lg[r-l+1];
return min(stmin[l][k],stmin[r-(1<<k)+1][k]);
}
ll c[N];
ll lowbit(ll x){return x&-x;}
void add(ll x){
while(x<=n){
++c[x];
x+=lowbit(x);
}
}
ll query(ll x){
ll ans=0;
while(x){
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
struct xx{
ll a,b;
bool operator <(const xx &lxl)const{
return b<lxl.b;
}
}bl[131][911];
ll b[131][911],stl[131][911][12];
void build(ll x){
ll cnt=0;
for(int i=st[x];i<=ed[x];++i) bl[x][++cnt]=(xx){val[i],a[i]};
sort(b[x]+1,b[x]+cnt+1);
for(int i=1;i<=cnt;++i) b[x][i]=bl[x][i].b;
for(int i=1;i<=cnt;++i) stl[x][i][0]=bl[x][i].a;
for(int j=1;j<11;++j)
for(int i=1;i<=cnt;++i)
stl[x][i][j]=max(stl[x][i][j-1],stl[x][min(n,i+(1<<(j-1)))][j-1]);
}
ll query_bl(ll x,ll l,ll r){
ll k=lg[r-l+1];
return max(stl[x][l][k],stl[x][r-(1<<k)+1][k]);
}
ll query_ans(ll l,ll r,ll x,ll y){
ll ans=0;
if(bel[l]==bel[r]){
for(int i=l;i<=r;++i)
if(a[i]>=x&&a[i]<=y)
ans=max(ans,val[i]);
return ans;
}
for(int i=l;i<=ed[bel[l]];++i)
if(a[i]>=x&&a[i]<=y) ans=max(ans,val[i]);
for(int i=st[bel[r]];i<=r;++i)
if(a[i]>=x&&a[i]<=y) ans=max(ans,val[i]);
for(int i=bel[l]+1;i<bel[r];++i){
ll vl,vr;
vl=lower_bound(b[i]+1,b[i]+siz[i]+1,x)-v;
vr=upper_bound(b[i]+1,b[i]+siz[i]+1,y)-v-1;
if(vl<=vr) ans=max(ans,query_bl(i,vl,vr));
}
return ans;
}
int main(){
//ios::sync_with_stdio(0);
//cin.tie(0); cout.tie(0);
cin>>sub>>n>>k>>Q>>o;
for(int i=1;i<=n;++i) cin>>a[i],v[i]=a[i];
ns=900,nq=n/ns+(n%ns!=0);
for(int i=1;i<=nq;++i){
st[i]=ns*(i-1)+1,ed[i]=MIN(ns*i,n);
for(int j=st[i];j<=ed[i];++j)
bel[j]=i;
siz[i]=ed[i]-st[i]+1;
}
for(int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
sort(v+1,v+n+1);
ll nm=unique(v+1,v+n+1)-v-1;
for(int i=1;i<=n;++i)
a[i]=lower_bound(v+1,v+nm+1,a[i])-v;
for(int i=1;i<=n;++i) stmax[i][0]=stmin[i][0]=a[i];
for(int j=1;j<20;++j)
for(int i=1;i<=n;++i)
stmax[i][j]=max(stmax[i][j-1],stmax[min(n,i+(1<<(j-1)))][j-1]),
stmin[i][j]=min(stmin[i][j-1],stmin[min(n,i+(1<<(j-1)))][j-1]);
for(int i=n;i>=1;--i){
add(a[i]); ll l,r;
l=lower_bound(v+1,v+nm+1,v[a[i]]-k)-v;
r=upper_bound(v+1,v+nm+1,v[a[i]]+k)-v-1;
val[i]=query(r)-query(l-1); //强
}
for(int i=1;i<=nq;++i) build(i);
while(Q--){
ll t,x,y,maxn,minn,vl,vr;
cin>>t>>x>>y;
if(o==1) t^=las,x^=las,y^=las;
minn=query_min(x,y),maxn=query_max(x,y);
vl=lower_bound(v+1,v+nm+1,v[maxn]-k)-v;
vr=upper_bound(v+1,v+nm+1,v[minn]+k)-v-1;
if(vl>vr||t>x){cout<<(las=0)<<'\n';continue;}
las=query_ans(t,x,vl,vr);
cout<<las<<'\n';
}
return 0;
}
頑張って