noip模拟75[是我语文拉了]
noip模拟75 solutions
怎么说今天考得确实是不好,(但是我确实是开心啊)
但是我发现有一个事实是不会改变的:
为什么 Amx 这么智障 ..?
为什么 AaMuXiiiiii 这么傻逼 ..?
今天时间分配极其不好,把太多的时间浪费在\(T1T2\)上
弃题的时间还是把握不好,总是觉得自己马上就能想出来了
所以以后一个题最多一个小时,多了就直接打暴力
还有不要被题面影响,出题人过于**,题目给的和难度过于不符
其次今天的出题人语文一看就是一年级老师教的,说话说不明白
弄得我两道题都不确定。。。。。。。
***出题人
T1 这TM是送分题!?
暴力是莫比乌斯反演。。我真是服了
这式子真**难推,复杂度真**难证
所以我不打算推式子,只是有一个小技巧
关于莫比乌斯函数的变化,多考虑它的取值和它跟质数个数的联系,
今天这个式子有一个证明竟然要二项式定理!!!
自己看官方题解去吧!!!
AC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=1e6+10;
const int mod=1e9+7;
int n,ans;
bool vis[N];
int mu[N],p[N],cnt;
int s(int x){
int l=1,r,ret=0;
while(l<=x){
r=x/(x/l);
ret=(ret+(x/l)*(r-l+1))%mod;
l=r+1;
}
return ret;
}
signed main(){
#ifdef oj
freopen("elegant.in","r",stdin);
freopen("elegant.out","w",stdout);
#endif
scanf("%lld",&n);mu[1]=1;
int sq=sqrt(n);
ans=mu[1]*s(n)%mod;
for(int i=2;i<=sq;i++){
if(!vis[i])p[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*p[j]<=sq;j++){
vis[i*p[j]]=true;
if(i%p[j]==0)break;
mu[i*p[j]]=-mu[i];
}
ans=(ans+mu[i]*s(n/(i*i))+mod)%mod;
}
printf("%lld",ans);
}
T2 阴阳
这个我是用\(Varuxn\)大神的\(set\)水过去的
暴力就是暴力,就是可以碾压正解
noAC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=1e5+5;
int type,n,m,t,c;
int to[N*2],nxt[N*2],head[N],rp;
void add_edg(int x,int y){
to[++rp]=y;
nxt[rp]=head[x];
head[x]=rp;
}
int fa[N],siz[N],son[N],dep[N];
int top[N];
void dfs_fi(int x){
siz[x]=1;son[x]=0;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==fa[x])continue;
fa[y]=x;dep[y]=dep[x]+1;
dfs_fi(y);siz[x]+=siz[y];
if(!son[x]||siz[y]>siz[son[x]])son[x]=y;
}
}
void dfs_se(int x,int f){
top[x]=f;
if(son[x])dfs_se(son[x],f);
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==son[x]||y==fa[x])continue;
dfs_se(y,y);
}
}
int LCA(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
int dis(int x,int y){
return dep[x]+dep[y]-2*dep[LCA(x,y)];
}
set<int> st[N];
int lans;
signed main(){
#ifdef oj
freopen("yygq.in","r",stdin);
freopen("yygq.out","w",stdout);
#endif
scanf("%d%d",&type,&n);
fo(i,1,n-1){
int x,y;scanf("%d%d",&x,&y);
add_edg(x,y);add_edg(y,x);
}
//cout<<"fuck"<<endl;
dfs_fi(1);
//cout<<"jb"<<endl;
dfs_se(1,1);
scanf("%d",&m);
//cout<<"Sb"<<endl;
while(m--){
int tp,x;
scanf("%d%d",&tp,&x);
x^=lans*type;
if(tp==1){
t++;
st[t]=st[c];
if(st[t].find(x)!=st[t].end())st[t].erase(x);
else st[t].insert(x);
c=t;
}
if(tp==2){
int ans=1000000000;
for(auto i:st[c])ans=min(ans,dis(i,x));
printf("%d\n",lans=ans);
}
if(tp==3)c=x;
}
}
T3 你猜是不是找规律
所以这个题的题目是出题人上回被\(ex\)了才出的这个题
气死我可啦,我都去找规律了,结果找了个寂寞
最后告诉我是拉格朗日插值并且,,,我不会证这个式子的次数
在学啦在学啊
AC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=3e3+5;
const int mod=1e9+7;
int n,k,ans;
inline int ksm(int x,int y){
int ret=1;
while(y){
if(y&1)ret=ret*x%mod;
x=x*x%mod;y>>=1;
}return ret;
}
inline int lglr(int n,int *x,int *y,int xi){
int ret=0;
for(int i=1;i<=n;i++){
int fz=1,fm=1;
for(int j=1;j<=n;j++){
if(i==j)continue;
fz=fz*((xi-x[j])%mod+mod)%mod,fm=fm*((x[i]-x[j])%mod+mod)%mod;
}
ret=(ret+y[i]*fz%mod*ksm(fm,mod-2)%mod)%mod;
}return (ret+mod)%mod;
}
int dp[2][N*2],xx[N*2],yy[N*2];
signed main(){
#ifdef oj
freopen("guess.in","r",stdin);
freopen("guess.out","w",stdout);
#endif
scanf("%lld%lld",&n,&k);
int now=0;
fo(i,0,2*k+1)dp[now][i]=1,yy[i]=1;
fo(j,1,k){
now^=1;
memset(dp[now],0,sizeof(dp[now]));
fo(i,1,2*k+1){
dp[now][i]=(dp[now][i-1]+dp[now^1][i-1]*(i-1))%mod;
yy[i]=(yy[i]+dp[now][i])%mod;
}
}
fo(i,1,2*k+1)xx[i]=i;
printf("%lld",lglr(2*k+1,xx,yy,n));
}
T4 确实背包妙啊
退背包板子题
AC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=105;
const int M=7005;
const int mod=1e9+7;
int n,v[N];
int sum[N];
int dp[N*M],res;
int f[2][2*N*M];
int mx,id,ch;
signed main(){
#ifdef oj
freopen("novel.in","r",stdin);
freopen("novel.out","w",stdout);
#endif
scanf("%lld",&n);
fo(i,1,n)scanf("%lld",&v[i]);
sort(v+1,v+n+1);
fo(i,1,n)sum[i]=sum[i-1]+v[i];
dp[0]=1;fo(i,1,n)fu(j,sum[i],v[i])dp[j]=(dp[j]+dp[j-v[i]])%mod;
fo(i,1,sum[n])res+=dp[i]?1:0;
//cout<<res<<endl;
fo(i,1,n){
int jus=res;
fo(j,v[i],sum[n]){
int tmp=dp[j];
dp[j]=(dp[j]-dp[j-v[i]]+mod)%mod;
if(tmp&&!dp[j])res--;
}
if(res>mx)mx=res,id=i;//cout<<res<<" "<<i<<endl;
res=jus;
fu(j,sum[n],v[i])dp[j]=(dp[j]+dp[j-v[i]])%mod;
}
fo(i,1,n){
if(id==i)sum[i]=sum[i-1];
else sum[i]=sum[i-1]+v[i];
}
int now=0;
f[now][sum[n]]=1;
fo(i,1,n){
if(id==i)continue;
now^=1;
fo(j,sum[n]-sum[i],sum[n]+sum[i]){
f[now][j]=f[now^1][j];
//if(j==sum[n]+2)cout<<j<<" "<<v[i]<<" "<<f[now^1][j-v[i]]<<endl;
if(j>=v[i])f[now][j]|=f[now^1][j-v[i]];
//if(j==sum[n]+2)cout<<f[now][j]<<endl;
if(j+v[i]<=2*sum[n])f[now][j]|=f[now^1][j+v[i]];
}
//cout<<f[now][sum[n]]<<endl;
}
//cout<<id<<endl;
fo(i,sum[n],2*sum[n]+1)if(!f[now][i]){ch=i-sum[n];break;}
printf("%lld %lld",v[id],ch);
}
QQ:2953174821