TopCoder SRM 569 Div2 1000 MegaFactorialDiv2

这次的1000好简单啊w(゚Д゚)w
然而我还是FST了。。因为中间忘记模了。。。

好像就是个大暴力啊
可以直接根据题目给出的递推式把 n!k n ! k 个各个质因子个数递推出来(不过空间开不下要用滚动数组)
求因子个数有个公式相信大家小学就知道了
x=pa11pa22pamm x = p 1 a 1 ⋅ p 2 a 2 ⋯ p m a m ,其中 p1,p2,,pm p 1 , p 2 , ⋯ , p m 为质数
x x 的因子个数为a1a2am
就相当于对每个质因子 pi p i 可以选 [0,ai] [ 0 , a i ] 次,共有 ai+1 a i + 1 种选法,根据乘法原理乘起来就行了。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1001;
const int P=1e9+9;
int L,b[N],p[N],s[N];
ll f[2][N][N];

class MegaFactorialDiv2 {
public:
    int countDivisors( int n, int K );
};

void init(int n){
    memset(f,0,sizeof f);
    for(int i=2;i<=n;i++){
        if (!b[i]) p[++L]=i;
        for(int j=1;j<=L&&i*p[j]<=n;j++){
            b[i*p[j]]=1;
            if (i%p[j]==0) break;
        }
    }
    //for(int i=1;i<=25;i++) cout<<p[i]<<' ';
}

int MegaFactorialDiv2::countDivisors(int n, int K) {
    init(N-1);
    int cur=0;
    for(int o=1;o<=n;o++){
        cur^=1;
        memset(f[cur],0,sizeof f[cur]);
        int x=o;
        for(int i=1;i<=L;i++)
         while(x%p[i]==0) x/=p[i],f[cur][0][i]++;
        for(int i=1;i<=K;i++)
         for(int j=1;j<=L;j++)
          f[cur][i][j]=(f[cur^1][i][j]+f[cur][i-1][j])%P;
    }
    ll ans=1;
    for(int i=1;i<=L;i++)
     ans=ans*(f[cur][K][i]+1)%P;
    return (int) ans%P;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值