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 去写周三大作业了
后记
世界孤立我任它奚落
完结撒花!