题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2813
题意:
定义Fibonacci数列为
对于某一个数i
可以等于j
),以及所有满足条件的j
的平方之和。询问次数
题解:
由定义不难得到
对于每个询问直接算因子明显会超时,考虑用线性筛法来做,埃式筛法复杂度为
记
对于欧式筛中:
代码:
#include <cstdio>
typedef long long LL;
const int maxc = 664580, maxv = 10000001, mod = 1000000007;
int cnt, prime[maxc], e[maxv], d[maxv], g[maxv], f[maxv], sumg, sumf;
bool vis[maxv];
int main()
{
int Q, q, A, B, C;
scanf("%d%d%d%d%d", &Q, &q, &A, &B, &C);
A %= C, B %= C;
g[1] = f[1] = 1;
for(int i = 2; i <= C; ++i)
{
if(!vis[i])
{
prime[cnt++] = i;
e[i] = d[i] = 1;
g[i] = 2;
f[i] = ((LL)i * i + 1) % mod;
}
for(int j = 0, k; j < cnt && (k = i * prime[j]) <= C; ++j)
{
vis[k] = 1;
if(i % prime[j] == 0)
{
e[k] = e[i] + 1;
g[k] = (g[i] / (e[i] + 1)) * (e[k] + 1);
d[k] = d[i];
f[k] = (f[i] * ((LL)prime[j] * prime[j] % mod) + f[d[i]]) % mod;
break;
}
else
{
e[k] = 1;
d[k] = i;
g[k] = g[i] << 1;
f[k] = f[i] * (((LL)prime[j] * prime[j] + 1) % mod) % mod;
}
}
}
while(Q--)
{
sumg += g[q] + (q & 1);
sumf += f[q] + 4 * (q & 1);
if(sumg >= mod) sumg -= mod;
if(sumf >= mod) sumf -= mod;
q = (q * (LL)A + B) % C + 1;
}
printf("%d\n%d\n", sumg, sumf);
return 0;
}
原文地址:http://blog.csdn.net/skywalkert/article/details/43970131