jzoj_斐波那契_2

こ雲淡風輕ζ 提交于 2019-12-02 15:41:14

Description
  小明有一个数列。
  a[0] = a[1] = 1。
  a[i] = i * a[i - 1] * a[i - 2](i≥2)。
  小明想知道a[n]的因子个数。

Input
  输入仅一个正整数n。

Output
  输出a[n]的因子个数mod 1,000,000,007的值。

Sample Input
  3

Sample Output
  4

Hint
  【数据范围】
  对于30%的数据满足0≤n≤1,000。
  对于100%的数据满足0≤n≤1,000,000。


 

筛素因子个数和可太骚了

利用埃式筛法非线性的缺点,

就是每个合数都会被她的所有苏影子筛一遍,

这道题就从苏影子出发,枚举包含苏影子的和数

#include<iostream>
#include<cstdio>

#define ri register int
#define u long long

namespace opt {

    inline u in() {
        u x(0),f(1);
        char s(getchar());
        while(s<'0'||s>'9') {
            if(s=='-') f=-1;
            s=getchar();
        }
        while(s>='0'&&s<='9') {
            x=(x<<1)+(x<<3)+s-'0';
            s=getchar();
        }
        return x*f;
    }

}

using opt::in;

#define NN 1000005
#define MO 1000000007

#include<cmath>
#include<cstring>

namespace mainstay {
    u num,low[NN],p[NN],f[NN]= {0,1,1};

    void pri(const u &N) {
        for(ri i(2); i<=N; ++i) {
            if(!low[i]) {
                p[++num]=i,low[i]=i;
            }
            for(ri j(1); j<=num; ++j) {
                if(p[j]>low[i]||p[j]>N/i) break;
                low[p[j]*i]=p[j];
            }
        }
    }
    
    u a[NN],ans(1);

    inline void solve() {
        u N(in());
        pri(N);
        if(N==0&&N==1) printf("%d",1);
        for(ri i(2); i<=N; ++i) f[i]=(f[i-1]+f[i-2])%MO;
        for(ri i(1); i<=num; ++i) {
            for(ri j(1);p[i]*j<=N;++j){
                u _x(p[i]*j),_t(f[N+1-_x]);
                while(!(_x%p[i])){
                    _x/=p[i],a[i]=(a[i]+_t)%MO;
                }
            }
        }
        for(ri i(1); i<=num; ++i) ans=(ans*((a[i]+1)%MO))%MO;
        std::cout<<ans;
    }

}

int main() {

    //freopen("fiborial.in","r",stdin);
    //freopen("fiborial.out","w",stdout);
    mainstay::solve();

}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!