0905机房赛总结


前言

是比赛,我死了
前两道同进制转化有关,后一道不会
被一大批比我小还比我强的人吊打
暴力打锅了 65 pts,最后只剩 65pts
qwq

T1

题意

给你一个复数,它的实部和虚部都是 $1e18$ 以内的整数,求其分解为$p=-1-i$ 的多个不同次幂的和,输出次幂即可

题解

发现给出复数,可以分解为$p^{k_1}+p^{k_2}+\cdots+p^{k_s}$ ,且 $k_1<k_2<\cdots<k_s$

通过打表,我们可以发现,对于 $p^k$ 只有当 k=1 时,其虚部和实部都为奇数,同时当 k=200 时,其实部和虚部都超出了 $1e18$ ,所以我们考虑将给出的复数不断除以$p$ ,当其实部和虚部都为奇数时,则说明当前序列第一项为 $p$ ,我们记录下除以 $p$ 的次数,记录答案后减去 $p$

一直重复上述过程直至其虚部和实部都为 $0$

特判一下 $k_1=0$ 的情况

代码

    comp t=(comp){x=read(),y=read()};
    comp p=(comp){-1,-1};
    if((t.x&1)^(t.y&1))ans[++tot]=0,t.x-=1;
    int cnt=1;
    while(t.x||t.y)
    {
        if((t.x&1)||(t.y&1))
        {
            ans[++tot]=cnt;
            t=t-p;
        }
        t=t/p;
        ++cnt;
    }
    printf("%d\n",tot);
    for(register int i=1;i<=tot;++i)printf("%lld\n",ans[i]);
    return 0;

总结

考试的时候想过 $p$ 进制下分解的唯一性,但没想到除法这方面
还分了 subtaxk 打暴力,结果少打了一个 return 0 暴力 50pts->25pts
qwq

T2

题意

给定一个长度为 $n$ 的整数序列 $a_1,a_2,a_3,\dots,a_n$ ,求多少个长度 $s>1$ 的子序列 $a_{k_1},a_{k_2},\dots,a_{k_s}$ 满足 $\left( \frac{a_{k_1}}{a_{k_2}}\right)\times\left( \frac{a_{k_2}}{a_{k_3}}\right)\times\cdots\times\left( \frac{a_{k_{s-1}}}{a_{k_s}}\right) \mod 2333>0$

其中 $\left(\frac{n}{m}\right)$ 表示组合数

输出方案数对 $1e9+7$ 取模

题解

2333 是个质数,我们由卢卡斯定理可以得到 $\left(\frac{n}{m}\right)\equiv \left(\frac{n \mod 2333}{m \mod 2333}\right)\cdot\left(\frac{n\text{÷}2333}{m\text{÷}2333}\right)\mod 2333$

我们只要保证对于所有的 $a_k$ 满足
$$
a_k >a_{k+1} \mod 2333\qquad, a_k\text{÷}2333>a_{k+1}\text{÷}3333
$$
由于是选取子序列,我们倒叙枚举,用二维树状数组记录符合条件的方案数即可

代码

inline void insert(int x,int y,ll d){for(register int i=x;i<=2333;i+=i&-i)for(register int j=y;j<=2333;j+=j&-j)tr[i][j]=(tr[i][j]+d)%p;}
inline int query(int x,int y){ll res=0;for(register int i=x;i;i-=i&-i)for(register int j=y;j;j-=j&-j)res=(tr[i][j]+res)%p;return res;}

signed main(void)
{
    n=read();
    for(register int i=1;i<=n;++i)mxx=max(mxx,a[i]=read());
    for(register int i=n;i;--i)
    {
        int qq=a[i]/2333+1,wq=a[i]%2333+1;
        ll t=query(qq,wq);
        ans=(ans+t)%p;
        insert(qq,wq,t+1);
    }
    printf("%lld\n",ans);
}

总结

考试时没想到卢卡斯定理,只打了 $a_i<2333$ 的 subtask ,然后
然后没对每个数+1,导致树状数组下标从 $0$ 开始 50pts->10pts
qwq

T3

不会


文章作者: Caicz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Caicz !
评论
  目录