前四题简单解析和代码
A.美丽新世界
考察暴力
题目数据范围很小我们可以用数组直接递推也可以使用3个变量递推即可
LL f1,f2,p,A;
LL qmi(LL a,LL b,LL p){
LL res=1;
while(b){
if(b&1) res=res*a%p;
b>>=1;
a=a*a%p;
}
return res;
}
void solve()
{
vector<LL> ans;
cin>>f1>>f2>>p>>A>>n;
LL f;
ans.push_back(f1);
if(n>=2)ans.push_back(f2);// 注意这个地方
for(int i=3;i<=n;i++){
f=log2(qmi(f2,f1,p)+1)+A;
ans.push_back(f);
f1=f2,f2=f;
}
for(auto&v:ans) cout<<v<<' ';
cout<<endl;
return ;
}
B.第二次生命
考察细节
我们考虑假设留下的这个位置那么后一个是x那么就一定是从他前面k个人开始移除,注意会到后面去处理一下即可,特别注意题目没有排序
LL w[N];
void solve()
{
cin>>n>>l>>k;
for(int i=1;i<=n;i++) cin>>w[i];
sort(w+1,w+1+n);
LL ans=0;
for(int i=2;i<=n;i++) ans=max(ans,w[i]-w[i-1]);
ans=max(ans,(w[1]-w[n]+l)%l);
for(int i=1;i<=n;i++){
LL res=0;
if(i<=k+1){
int last=k-(i-1);
last=n-last;
res=(w[i]-w[last]+l)%l;// 处理跑到后面去了
}
else{
int last=i-k-1;
res=(w[i]-w[last]+l)%l;
}
ans=max(ans,res);
}
cout<<ans<<endl;
return ;
}
C.夜色亵渎者
考察异或的性质
我们直接对答案进行移动会发现ai^bj=aj^ai我们移动一下就是(ai^bi)^(aj^bj)=0 异或的性质
接着就用map来处理即可
int a[N],b[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++){
mp[a[i]^b[i]]++;
}
LL ans=0;
for(auto&[v,w]:mp){
ans+=(LL)w*w;
}
cout<<ans<<endl;
return ;
}
D.在仙境之外
考虑二进制
对于这个大问题我们不妨考虑一个小问题,如果n等于1的时候如何处理,我们发现可以自己对自己进行运算如果我们把这个数自己对自己做除法得到的就是1,同时我们充分运用自己和自己运算就会发现变成了二进制的1的判断我一直对第一个数从1开始*2接着看我的s这一个位置是否有1,注意不要超过1e18,由此无论n为多少都一样的操作即可
LL s;
LL w[N];
struct code{
int x,a,b;
char op;
}e[N];
void solve()
{
int cnt=0;
cin>>n>>s;
for(int i=1;i<=n;i++) cin>>w[i];
e[++cnt]={1,1,1,'/'};
LL st=1;
int x=1;
for(int i=0;i<64;i++){
if(s>>i&1) e[++cnt]={n+1,n+1,x,'+'};
if(2*st>1e18) break;// 注意不要爆了
st+=st;
e[++cnt]={x,x,x,'+'};
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
auto [x,a,b,op]=e[i];
cout<<x<<' '<<a<<' '<<b<<' '<<op<<endl;
}
return ;
}