noip模拟26
A.神炎皇
打表就能\(A\)的题目..
由于题解很清晰,所以这里不再赘述..

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;
}

浙公网安备 33010602011771号