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();
}