noip模拟47
A. Pirme
签到题.
A_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
#define ll long long int
#define ull unsigned ll
#define re register ll
#define lf double
#define lbt(x) (x&(-x))
#define mp(x,y) make_pair(x,y)
#define lb lower_bound
#define ub upper_bound
#define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
#define Fill(x,y) memset(x,y,sizeof x)
#define Copy(x,y) memcpy(x,y,sizeof x)
inline ll read() {
ll ss=0; bool cit=1; char ch;
while(!isdigit(ch=getchar())) if(ch=='-') cit=0;
while(isdigit(ch)) ss=(ss<<3)+(ss<<1)+(ch^48),ch=getchar();
return cit?ss:-ss;
}
} using namespace BSS;
const ll N=1e7+31;
ll le,ri,s,cnt;
ll pri[N],vis[N];
inline void Oula(){
ll lmt=min((ll)sqrt(ri),s);
for(re i=2;i<=lmt;++i){
if(!vis[i]) pri[++cnt]=i;
for(re j=1;pri[j]*i<=lmt and j<=cnt;++j){
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
}
signed main(){
le=read(),ri=read(),s=read();
Oula(),Fill(vis,0); ll ans=0,st;
for(re i=1;i<=cnt;++i){
st=le/pri[i]-(le%pri[i]>0),st*=pri[i];
for(re k=0;k*pri[i]<=ri-st;++k)
if(st-le+k*pri[i]>=0)
vis[st-le+k*pri[i]]=1;
if(le<=pri[i]) vis[pri[i]-le]=0;
}
for(re i=le;i<=ri;++i) if(!vis[i-le]) ans^=i;
printf("%lld\n",ans);
exit(0);
}
B. Sequence
贪心地动态规划,矩阵优化.
B_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
#define ll long long int
#define ull unsigned ll
#define re register ll
#define lf double
#define lbt(x) (x&(-x))
#define mp(x,y) make_pair(x,y)
#define lb lower_bound
#define ub upper_bound
#define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
#define Fill(x,y) memset(x,y,sizeof x)
#define Copy(x,y) memcpy(x,y,sizeof x)
inline ll read() {
ll ss=0; bool cit=1; char ch;
while(!isdigit(ch=getchar())) if(ch=='-') cit=0;
while(isdigit(ch)) ss=(ss<<3)+(ss<<1)+(ch^48),ch=getchar();
return cit?ss:-ss;
}
} using namespace BSS;
const ll N=1e6+51;
const ll mod=1e9+7;
ll m,n,t;
ll w[N],dp[111],pre[111],f[111],vis[111];
ll g[111][111];
struct I { ll id,lst; } p[111];
inline void inc(ll &i,ll j){ i+=j+mod*mod; if(i>=mod) i%=mod; }
inline bool comp(I i,I j){ return i.lst<j.lst; }
inline void Init(){
n=read(),m=read(),t=read();
for(re i=1;i<=n;++i) w[i]=read();
}
inline void mul(){
ll c[111]={0};
for(re i=1;i<=t;++i)
for(re j=1;j<=t;++j)
inc(c[i],dp[j]*g[i][j]%mod);
Copy(dp,c);
}
inline void mulself(){
ll c[111][111]={0};
for(re i=1;i<=t;++i)
for(re j=1;j<=t;++j)
for(re k=1;k<=t;++k)
inc(c[i][j],g[i][k]*g[k][j]);
Copy(g,c);
}
inline void Work(){
ll sum=0,temp;
for(re i=1;i<=n;++i){
temp=sum,inc(sum,mod-dp[w[i]]),p[w[i]].lst=i;
dp[w[i]]=(temp+1)%mod,inc(sum,dp[w[i]]);
}
for(re i=1;i<=t;++i) p[i].id=i;
sort(p+1,p+1+t,comp);
for(re i=1;i<=t;++i) f[i]=dp[p[i].id];
for(re i=1;i<=t;++i) dp[i]=f[i];
dp[t+1]=1;
for(re i=1;i<=t;++i){
for(re j=1;j<=t+1;++j) inc(g[i][j],pre[j]);
for(re j=i;j<=t+1;++j) g[i][j]++;
for(re j=1;j<=t+1;++j) inc(pre[j],g[i][j]);
}
for(re i=1;i<=t;++i) g[t+1][i]=0;
g[t+1][t+1]=1,++t;
ll ts=m/(t-1);
while(ts){
if(ts&1) mul();
mulself(),ts>>=1;
}
sum=0; --t;
for(re i=1;i<=t;++i) inc(sum,dp[i]);
// for(re i=1;i<=t;++i) cout<<dp[i]<<" ";
// cout<<endl;
for(re i=1;i<=m-(m/t*t);++i){
temp=sum,inc(sum,mod-dp[i]),
dp[i]=temp+1,inc(sum,dp[i]);
}
printf("%lld",sum%mod);
}
signed main(){
Init(),Work();
exit(0);
}
C. Omeed
合并的时候式子推一推就好了.
C_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
#define ll long long int
#define ull unsigned ll
#define lf double
#define lbt(x) (x&(-x))
#define mp(x,y) make_pair(x,y)
#define lb lower_bound
#define ub upper_bound
#define Fill(x,y) memset(x,y,sizeof x)
#define Copy(x,y) memset(x,y,sizeof x)
#define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
#define FILE(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
inline int read() {
int ss=0; bool cit=1; char ch;
while(!isdigit(ch=getchar())) if(ch=='-') cit=0;
while(isdigit(ch)) ss=(ss<<3)+(ss<<1)+(ch^48),ch=getchar();
return cit?ss:-ss;
}
} using namespace BSS;
#define ls x<<1
#define rs x<<1|1
const ll N=5e5+51,mod=998244353;
ll m,n,t,A,B,ops;
ll rt[N];
struct I { ll a,b,k,sumk,sumb; } tr[N<<3],ans;
inline ll ksm(ll a,ll b,ll c){
ll res=1; a%=c;
while(b){
if(b&1) res=(res*a)%c;
a=(a*a)%c,b>>=1;
}
return res%c;
}
inline void pushup(ll x){
tr[x].a=(tr[ls].a+tr[rs].a)%mod,tr[x].k=tr[ls].k*tr[rs].k%mod,tr[x].b=(tr[ls].b*tr[rs].k%mod+tr[rs].b)%mod;
tr[x].sumk=(tr[ls].k*tr[rs].sumk+tr[ls].sumk)%mod,tr[x].sumb=(tr[rs].sumk*tr[ls].b%mod+tr[ls].sumb+tr[rs].sumb)%mod;
}
void query(ll x,ll l,ll r,ll ql,ll qr){
if(l>=ql and r<=qr){
ans.sumk=(tr[x].sumk*ans.k+ans.sumk)%mod,ans.sumb=(ans.b*tr[x].sumk%mod+ans.sumb+tr[x].sumb)%mod;
ans.a=(ans.a+tr[x].a)%mod,ans.k=ans.k*tr[x].k%mod,ans.b=(ans.b*tr[x].k%mod+tr[x].b)%mod;
return ;
}
ll mid=(l+r)>>1;
if(ql<=mid) query(ls,l,mid,ql,qr);
if(qr>mid) query(rs,mid+1,r,ql,qr);
}
void build(ll x,ll l,ll r){
if(l==r){
tr[x].a=rt[l],tr[x].b=rt[l],tr[x].sumb=rt[l],tr[x].sumk=rt[l];
tr[x].k=(rt[l]+t-rt[l]*t%mod+mod)%mod;
return ;
}
ll mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
pushup(x);
}
void update(ll x,ll l,ll r,ll pos){
if(l==r){
tr[x].a=rt[l],tr[x].b=rt[l],tr[x].sumb=rt[l],tr[x].sumk=rt[l];
tr[x].k=(rt[l]+t-rt[l]*t%mod+mod)%mod;
return ;
}
ll mid=(l+r)>>1;
if(pos<=mid) update(ls,l,mid,pos);
else update(rs,mid+1,r,pos);
pushup(x);
}
signed main(){
ll l,r,opt,x; read();
n=read(),ops=read(),t=read(),t=t*ksm(read(),mod-2,mod)%mod,A=read(),B=read();
for(int i=1;i<=n;++i) rt[i]=read(),rt[i]=rt[i]*ksm(read(),mod-2,mod)%mod;
build(1,1,n);
while(ops--){
if(read()&1){
l=read(),r=read(),ans.a=0,ans.b=0,ans.k=0,ans.sumk=0,ans.sumb=0;
query(1,1,n,l,r),printf("%lld\n",(A*ans.a%mod+B*ans.sumb%mod)%mod);
}
else x=read(),rt[x]=read(),rt[x]=rt[x]*ksm(read(),mod-2,mod)%mod,update(1,1,n,x);
}
exit(0);
}

浙公网安备 33010602011771号