codeforces 300(Round #181)题解

A:我的决策是,首先将一个负数分到第一组,如果所有数乘积为负第三组分一个0,否则,第三组分一个0和一个负数,其他分到第二组

B:暴力即可,也可写并查集

C:枚举判断答案,重点在组合数取模,除以一个数再取模,只需乘上这个数的乘法逆元再取模即可。

根据费马小定理,a^(p-1)=1(mod p) -> a*a^(p-2)=1(mod p),则a^(p-2)就是a的乘法逆元

code

D:dp题,首先引用一张图


一个大于1的奇数可以分成4个奇数/2的正方形,于是我们可以按层数dp。dp[i][j]表示第i层j个操作数的方案数

很容易想到dp[i][j]=dp[i-1][k1]*dp[i-1][k2]*dp[i-1][k3]*dp[i-1][j-1-k1-k2-k3],但是时间复杂度无法接受,我们可以k^2预处理上一层d[k1+k2]=dp[i-1][k1]*dp[i-1][k2],再k^2计算d[x]*d[j-1-x]即可

code

E:线性筛法求质因数。难点在于统计每个质因子个数。这里用MIN[i]表示i的最小素因子编号 ,bigger[i]表示大于等于i的数有几个,p[]是质数表

    for(i=10000000;i>=2;--i)
    {
        cnt[MIN[i]]+=bigger[i];
        bigger[i/p[MIN[i]]]+=bigger[i]; 
    } 

如此计算即可

code

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值