Loading

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);
}
posted @ 2021-09-10 15:55  AaMuXiiiiii  阅读(33)  评论(0)    收藏  举报