9.15 模拟赛

前言

业精于勤荒于嬉,行成于思毁于随

正文(模拟赛)

卦象:大凶 \(+\) 忌打模拟赛,算是 buff 叠满

感受:可能没什么感受,毕竟是做过的题。一眼 \(1,2,5\) 瞪出卡特兰数,口胡了 T1,然后去厕所小住一会,回来后一开 T2 是个典中典,直接跳了看 T3。T3 感觉做过,是个性质与分讨题,显然脑袋记不住那么久远而神秘的结论,只能现推。忽然发现样例输入输出立大功,解决了各式各样的关键问题。最后也算是连蒙带猜的过了 T3,截至目前已经过了 2h。瞄了一眼 T4,感觉不是很可做,先象征性意义地码了 T4 的\(5\)pts,然后回去码 T1 T2。u1s1,这种策略的确非常大胆,毕竟万一代码出锅可能就卡住了,不过结果是幸运的,也是码掉了前三个题。最后剩余一个多小时,细看 T4,不会不会还是不会,被迫罚坐。只能闲来无事去搞一搞 T1 的对拍,并尝试给出 Catalan 数在 T1 上的组合意义理解……比赛时间悠悠而过,没有挂分,还算不错

T1

Catalan 数板板题,可以直接观察样例,也可以推 DP 式子发现这是 Catalan 数

T2

发现答案直线一定过两个线段端点,或者可以调整为上述情况

枚举答案所在直线必过点,经典极角排序,然后就开始什么双指针(或扫描线)维护答案

corner case 是只经过一条线段的情况,机房里好多人都因此喜提 \(80\)pts

T3

通过样例和部分简单分析可以得出 \(S=1\),和 \(S=0\)\(n\) 是非 \(2\) 整数次幂的偶数的所有结论

然后根据 \(2\) 的整数次幂的结论,也可以推出 \(n\) 为普通偶数的结论

可能没什么 oi 的事,就必须去自己一点一点手模找规律

T4

rz 大分讨,重要观测是 \(p_i \le b\),并据此分类讨论

\(p_i=b\) 的情况,比较显然因为多项式最多只有一项,简单分讨 \(a,b,c\) 的取值即可

\(p_i<b\) 的情况,容易发现此时所有 \(p_i\) 唯一确定,等价于 \(c\)\(b\) 进制表示。计算后,用 \(f(a)=b\) 检查

关于输出方案,需要一些代码能力,用一个 vector 维护即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define i2 __int128
#define vi vector<int>
#define pb push_back
using namespace std;
const int N=65,MOD=(1ll<<61)-1;
int a,b,c,p[N];vi res,tmp;
inline bool check(int x,int y,int cnt){
	i2 sum=0,pw=1;
	for(int i=0;i<=cnt;i++){
		sum=(sum+p[i]*pw%MOD)%MOD;
		pw=pw*x%MOD;
	}
	return sum%MOD==y%MOD;
}
inline vi MAX(vi s,vi t){
	if(!s.size())return t;
	if(!t.size())return s;
	if(s.size()<t.size())return t;
	if(s.size()>t.size())return s;
	int _size=s.size()-1;
	for(int i=0;i<=_size;i++){
		if(s[i]<t[i])return s;
		if(t[i]<s[i])return t;
	}
	return s;
}
inline void solve(){
	cin>>a>>b>>c;
	int ans=0;
	if(a==1&&b==1&&c==1){cout<<-1<<'\n';return;}
	if(a==1&&b==1&&c>1){cout<<0<<'\n';return;}
	if(b==c){
		ans++;tmp.clear();tmp.pb(b);
		res=MAX(res,tmp);
	}
	if(a==1&&b>1){
		int cnt=0,x=c;
		while(x%b==0)cnt++,x/=b;
		if(x==1&&cnt>1){
			ans++;tmp.clear();tmp.pb(b);
			for(int i=cnt-2;i>=0;i--)tmp.pb(0);
			res=MAX(res,tmp);
		}
	}
	if(b>1){
		int cnt=-1,x=c;
		while(x)p[++cnt]=x%b,x/=b;
		if(check(a,b,cnt)){
			ans++;tmp.clear();
			for(int i=cnt;i>=0;i--)tmp.pb(p[i]);
			res=MAX(res,tmp);
		}
	}
	cout<<ans<<'\n';
	if(ans==0)return;
	int _size=res.size()-1;
	cout<<_size<<' ';
	for(int i=0;i<=_size;i++)cout<<res[i]<<' ';
	cout<<'\n';
	return;
}
inline void clr(){
	memset(p,0,sizeof(p));res.clear();
	return;
}
signed main(){
	freopen("polynomial.in","r",stdin);
	freopen("polynomial.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T;cin>>T;while(T--)solve(),clr();
	return 0;
}

小结

要 gun 去写周三大作业了

后记

世界孤立我任它奚落

完结撒花!

posted @ 2025-09-15 18:35  sunxuhetai  阅读(6)  评论(0)    收藏  举报