Loading

noip模拟26

A.神炎皇

打表就能\(A\)的题目..
由于题解很清晰,所以这里不再赘述..
image

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 lb lower_bound 
	#define ub upper_bound 
	#define mp make_pair
	#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) memset(y,x,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;
	}
	inline void write(ll ss)
	{
		static int stas[35]; int topps=0;
  		if(ss<0) putchar('-'),ss=-ss;
  		do{stas[++topps]=ss%10,ss/=10;}while(ss);
  		while(topps) putchar(stas[topps--]+48); puts("");
	}
} using namespace BSS;

const ll N=1e7+50;

ll n,ans,cnt;
ll vis[N],pri[N],phi[N];
inline void Oula(ll range)
{
	vis[1]=1; phi[1]=1;
	for(re i=2;i<=range;i++)
	{
		if(!vis[i])
		{
			vis[i]=i;
			phi[i]=i-1;
			pri[++cnt]=i;
		}
		for(re j=1;j<=cnt and pri[j]*i<=range;j++)
		{
			vis[i*pri[j]]=1;
			phi[i*pri[j]]=phi[i]*phi[pri[j]];
			if(i%pri[j]==0) 
			{
				phi[i*pri[j]]=phi[i]*pri[j];
				break;
			}
		}
	}
	return ;
}
signed main()
{
	n=read();	Oula(sqrt(n));
	ll ans=0;
	for(re i=2;i<=sqrt(n);i++)
	{
		ans+=phi[i]*(n/(i*i));
	}
	write(ans);
	return 0;
}
/*

B.降雷皇

裸线段树,不是很难..

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 lb lower_bound 
	#define ub upper_bound 
	#define mp make_pair
	#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) memset(y,x,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;
	}
	inline void write(ll ss)
	{
		static int stas[35]; int topps=0;
  		if(ss<0) putchar('-'),ss=-ss;
  		do{stas[++topps]=ss%10,ss/=10;}while(ss);
  		while(topps) putchar(stas[topps--]+48); puts("");
	}
} using namespace BSS;

const ll N=100050;
const ll mod=123456789;

ll n,maxn,m,tot,root,type;
ll val[N];
struct I { ll w,ls,rs,num; } tr[N*64]; // w 存储方案数
void build(ll &x,ll l,ll r)
{
	if(!x) x=++tot;
	if(l==r) return ;
	ll mid=(l+r)>>1;
	build(tr[x].ls,l,mid); build(tr[x].rs,mid+1,r);
	return ;
}
void pushup(ll x)
{
	tr[x].w=max(tr[tr[x].ls].w,tr[tr[x].rs].w);
	tr[x].num=0;
//	cout<<x<<" "<<tr[x].ls<<" "<<tr[x].rs<<" "<<tr[x].w<<" "<<tr[tr[x].ls].w<<" "<<tr[tr[x].rs].w<<" "<<tr[tr[x].ls].num<<" "<<tr[tr[x].rs].num<<endl;
	if(tr[tr[x].ls].w==tr[x].w) tr[x].num+=tr[tr[x].ls].num;
	if(tr[tr[x].rs].w==tr[x].w) tr[x].num+=tr[tr[x].rs].num;
	tr[x].num%=mod;
	return ;
}
void update(ll &x,ll l,ll r,ll w,ll num,ll pos)
{
	if(!x) x=++tot;
	if(l==r)
	{
		if(tr[x].w>w) return ;
		if(tr[x].w==w) tr[x].num+=num;
		else tr[x].num=num,tr[x].w=w;
		tr[x].num%=mod;
		return ;
	}
	ll mid=(l+r)>>1;
	if(pos<=mid) update(tr[x].ls,l,mid,w,num,pos);
	else update(tr[x].rs,mid+1,r,w,num,pos);
	pushup(x);
	return ;
}
pair<ll,ll> query(ll x,ll l,ll r,ll qr)
{
	if(!x) return mp(0,0);
	if(r<=qr)
	{
		return mp(tr[x].w,tr[x].num);
	}
	ll mid=(l+r)>>1;
	if(qr<=mid) return query(tr[x].ls,l,mid,qr);
	pair<ll,ll> temp; ll tmp=tr[x].ls;
	temp=query(tr[x].rs,mid+1,r,qr);
	if(tr[tmp].w<temp.first) return temp;
	if(tr[tmp].w>temp.first) return mp(tr[tmp].w,tr[tmp].num);
	return mp(temp.first,temp.second+tr[tmp].num);
}
signed main()
{
	n=read(); type=read();
	for(re i=1;i<=n;i++) val[i]=read(),maxn=max(maxn,val[i]);
	build(root,1,maxn);
	pair<ll,ll> temp;
	for(re i=1;i<=n;i++)
	{
		temp=query(root,1,maxn,val[i]-1);
		temp.first++; if(!temp.second) temp.second++;
		update(root,1,maxn,temp.first,temp.second,val[i]);
	}
	write(tr[root].w); if(type) write(tr[root].num);
	return 0;
}

C.幻魔皇

自己打了一个记忆化搜索,复杂度是没有问题的,但是被卡常卡的很死,至今也只有80分..

C_Fake in 80pts
#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 lb lower_bound 
	#define ub upper_bound 
	#define mp make_pair
	#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) memset(y,x,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;
	}
	inline void write(ll ss)
	{
		static int stas[35]; int topps=0;
  		if(ss<0) putchar('-'),ss=-ss;
  		do{stas[++topps]=ss%10,ss/=10;}while(ss);
  		while(topps) putchar(stas[topps--]+48); putchar(' ');
	}
} using namespace BSS;

const ll N=7e3+50;
const ll mod=123456789;

ll n,cnt,tot;
ll fib[N],ans[N],f2[N];
signed main()
{
	n=read();
	fib[1]=1; fib[2]=1;
	for(re i=3;i<=N-50;i++)
	{
		fib[i]=(fib[i-1]+fib[i-2])%mod;
	}
	for(re i=1;i<=n;i++)
	{
		ans[i]=(ans[i]+fib[i-1]*fib[n-i]%mod)%mod;
	}
	for(ll i=1;i<=n;i++)
	{
		ans[i+1]=(ans[i+1]+(fib[i-1]*(fib[n-i+1]-1)%mod))%mod;
		if(i<=2) continue;
		for(ll j=1;j<=n;j++)
		{
			ans[i+j]=(ans[i+j]+((fib[i-2]*fib[j-1]%mod)*(fib[n-max(i,j)+1]-1)%mod)%mod)%mod;
		}
	}
	for(re i=1;i<=(n<<1);i++)
	{
		write(ans[i]);
	}
	return 0;
}

Yubai 大神亲身传授触手方案.

我们发现不同长度的触手有着固定方案的起点和终点,累加即可..
复杂度极优..

C_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 lb lower_bound 
	#define ub upper_bound 
	#define mp make_pair
	#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) memset(y,x,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;
	}
	inline void write(ll ss)
	{
		static int stas[35]; int topps=0;
  		if(ss<0) putchar('-'),ss=-ss;
  		do{stas[++topps]=ss%10,ss/=10;}while(ss);
  		while(topps) putchar(stas[topps--]+48); putchar(' ');
	}
} using namespace BSS;

const ll N=1e5+50;
const ll mod=123456789;

ll n,cnt,tot;
ll fib[N],ans[N],f2[N];
signed main()
{
	n=read();
	fib[1]=1; fib[2]=1;
	for(re i=3;i<=N-50;i++)
	{
		fib[i]=(fib[i-1]+fib[i-2])%mod;
	}
	for(re i=1;i<=n;i++)
	{
		ans[i]=(ans[i]+fib[i-1]*fib[n-i]%mod)%mod;
	}
	for(ll i=1;i<=n;i++)
	{
		ans[i+1]=(ans[i+1]+(fib[i-1]*(fib[n-i+1]-1)%mod))%mod;
		if(i<=2) continue;
		for(ll j=1;j<=n;j++)
		{
			ans[i+j]=(ans[i+j]+((fib[i-2]*fib[j-1]%mod)*(fib[n-max(i,j)+1]-1)%mod)%mod)%mod;
		}
	}
	for(re i=1;i<=(n<<1);i++)
	{
		write(ans[i]%mod);
	}
	return 0;
}
posted @ 2021-08-06 14:36  AaMuXiiiiii  阅读(48)  评论(0)    收藏  举报