CSP2022-J 游记
CSP-J
\(T1\) 一眼看出直接快速幂,其实直接乘就可以,特判一下\(1,2\)以上次数不会超过\(logn\),看看是否大于零就行了,\(20min\)解决。代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b;
int qpow(int a,int b){
//cout<<b<<endl;
int kk;
if(b==1) return a;
if(b%2==0){
kk=qpow(a,b/2);
if(kk==-1) return -1;
//cout<<kk<<endl;
if(kk*kk>1000000000) return -1;
kk*=kk;
}
else{
kk=qpow(a,b/2);
if(kk==-1) return -1;
//cout<<kk<<endl;
if(kk*kk>1000000000) return -1;
kk*=kk;
if(kk*a>1000000000) return -1;
kk*=a;
}
return kk;
}
signed main(){
//freopen("pow.in","r",stdin);
//freopen("pow.out","w",stdout);
cin>>a>>b;
if(b==0){
cout<<1;
return 0;
}
cout<<qpow(a,b);
return 0;
}
\(T2\) 显然结论题,虽然我可以二分,但我就是不二分,我推式子,首先我们知道:
\(n= p * q\)
\(e * d = p * q - p - q\)
那么相减,直接就得出\(p + q\),加上\(p * q\)也知道,知二求二算出\(p - q\),和\(p + q\)列方程就行了,算出来以后比对一下满不满足条件就行。代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int k;
int ans;
int n,p,q,e,d;
void gett(int xx,int yy){
int zz=(int)sqrt(xx*xx-4*yy);
p=(xx-zz)/2;
q=xx-p;
}
signed main(){
//freopen("decode.in","r",stdin);
//freopen("decode.out","w",stdout);
cin>>k;
while(k--){
ans=-1;
cin>>n>>e>>d;
gett(n-e*d+2,n);
if(p*q==n && (p-1)*(q-1)+1==e*d) cout<<p<<" "<<q<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
\(T3\) 考场直接狂码\(2\)小时特例,真的不推荐先开T3,太难了,看代码不要笑我,长度小于等于3我是直接全部特判的,代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int duan1;
int duan2;
stack<int> stk;
bool flag1=false;
bool flag2=false;
void ans1(){
if(s[0]=='(') cout<<s[1]-'0'<<endl<<0<<" "<<0;
else if(s[1]=='&'){
if(s[0]=='0'){
cout<<0<<endl<<1<<" "<<0;
}
else{
int jj=s[0]-'0',kk=s[2]-'0';
jj&=kk;
cout<<jj<<endl<<0<<" "<<0;
}
}
else{
if(s[0]=='1'){
cout<<1<<endl<<0<<" "<<1;
}
else{
int jj=s[0]-'0',kk=s[2]-'0';
//cout<<jj<<" "<<kk<<endl;
jj|=kk;
cout<<jj<<endl<<0<<" "<<0;
}
}
}
//特判S<=3
int l=0;
void gett(){
for(int i=0;i<s.size();i++){
if(s[i]=='|') flag1=true;
if(s[i]=='&'){flag2=true;l++;}
}
}
int ans3(int now){//只有&
int k=-1000;
//cout<<"Yes!!!"<<endl;
for(int i=now;i<s.size();i++){
//cout<<i<<endl;
if(s[i]=='(' && s[i+1]=='(') continue;
if(s[i]==')' && s[i+1]==')') continue;
if(s[i]>='0' && s[i]<='9') k=(s[i]-'0');
if(s[i]==')' && now!=0) return k;
if(s[i]=='&'){
//if(now!=0) cout<<i<<endl;
//cout<<k<<endl;
if(k==0){
duan1++;
if(s[i+1]=='('){
while(s[i+1]!=')') i++;
}
else i++;
}
else{
if(s[i+1]>='0' && s[i+1]<='9'){
k=k&(s[i+1]-'0');
i++;
}
else{
k=k&ans3(i+1);
while(s[i+1]!=')') i++;
}
}
}
}
return k;
}
int ans4(int now){//只有|
int k=-1000;
for(int i=now;i<s.size();i++){
if(s[i]=='(' && s[i+1]=='(') continue;
if(s[i]==')' && s[i+1]==')') continue;
if(s[i]>='0' && s[i]<='9') k=(s[i]-'0');
if(s[i]==')' && now!=0) return k;
if(s[i]=='|'){
if(k==1){
duan2++;
if(s[i+1]=='('){
while(s[i+1]!=')') i++;
}
else i++;
}
else{
if(s[i+1]>='0' && s[i+1]<='9'){
k=k|(s[i+1]-'0');
i++;
}
else{
k=k|ans3(i+1);
while(s[i+1]!=')') i++;
}
}
}
}
return k;
}
int ans5(){//没有()
string s1="";
for(int i=0;i<s.size();i++){
if(s[i]=='(' && s[i+1]=='(') continue;
if(s[i]==')' && s[i+1]==')') continue;
if(s[i]>='0' && s[i]<='9'){
if(s[i+1]!='&'){
if(!(i>0 && s[i-1]=='&')) s1+=s[i];
}
}
else if(s[i]=='|') s1+=s[i];
else{
int kk=s[i-1];
kk&=(s[i+1]-'0');
s1+=(kk+'0');
}
}
s="";
for(int i=0;i<s1.size();i++){
s+=s1[i];
}
ans4(0);
}
int main(){
//freopen("expr.in","r",stdin);
//freopen("expr.out","w",stdout);
cin>>s;
if(s.size()==3) ans1();
//else if(s.size()==5) ans2();//没判出来
else{
gett();
if(!flag1 && flag2){
cout<<ans3(0);
cout<<endl<<duan1<<" "<<0;
}
else if(flag1 && !flag2){
cout<<ans4(0);
cout<<endl<<0<<" "<<duan2;
}
else{
cout<<ans5();
cout<<endl<<duan1<<" "<<duan2;
}
}
return 0;
}
在那高远的黑色穹顶之下,它的牺牲使圣巢永世不衰

浙公网安备 33010602011771号