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;
}
posted @ 2023-07-27 14:36  星河倒注  阅读(26)  评论(0)    收藏  举报