Dibonacci
Source : lancelot | |||
Time limit : 5 sec | Memory limit : 128 M |
Submitted : 10, Accepted : 8
Input
Input file contains the only integer number n(1<=n<=1000000),no more than 20 numbers.Output
The answer modulo 1000000007.Sample Input
3 4
Sample Output
4 10
被学弟虐的那场校赛的题,原因是手慢,还被卡了,要是组队赛,这题还是可以切的。当时没有仔细想,实际上关键是求出幂的规律,第一眼感觉是飞瀑纳妾数列,实际就是
。用手写个几项即可看出。接下来如何快速的求各个因子的个数呢?
我们知道的是对于一个数质因子分解后,把不同的质因子数加1乘起来即是要求的所有能被整除的因子的个数。
对于阶乘,很特殊,很简单的, 连除即可。但是这个也是连续的数,但是因子都不同,没办法只能分别统计。我们先筛素,然后统计,统计技术看代码!
事后发现很easy!
代码如下:
/*
* File: main.cpp
* Author: hit-acm
*
* Created on 2012年5月31日, 下午5:41
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define LL long long
const int MAX = 1000000 + 10;
const LL mod = 1000000007;
bool NIsprime[MAX];
int prime[MAX];
int p_size;
LL xp[MAX];
void getprime() {
memset(NIsprime, false, sizeof (NIsprime));
NIsprime[0] = NIsprime[1] = true;
p_size = 0;
for (int i = 2; i < MAX; i++) {
if (!NIsprime[i]) {
prime[p_size++] = i;
for (int j = 2; i * j < MAX; j++) {
NIsprime[i * j] = true;
}
}
}
}
void getexp() {
xp[0] = xp[1] = 1;
for (int i = 2; i < MAX; i++) {
xp[i] = (xp[i - 1] + xp[i - 2]) % mod;
}
}
LL getans(int n) {
LL p_num;
LL res = 1;
for (int i = 0; i < p_size; i++) {
p_num = 0;
for (int j = 1; j * prime[i] <= n; j++) {
int k = j * prime[i];
int temp = k;
while (temp % prime[i] == 0) {
temp /= prime[i];
p_num = (p_num + xp[n - k]) % mod;
}
}
res = (res * (p_num + 1)) % mod;
}
return res;
}
int main() {
getexp();
getprime();
int n;
while (scanf("%d", &n) != EOF) {
printf("%lld\n", getans(n));
}
return 0;
}