BZOJ 2813 奇妙的Fibonacci 线性筛

题目大意:给定i,求斐波那契数列中有多少F[j]是F[i]的约数,以及这些j的平方和

定理:Gcd(F[i],F[j])=F[Gcd(i,j)]

证明见 http://hi.baidu.com/wyl8899/item/b4ed30e6b9f404acce2d4f68

那么当F[j]|F[i]时,必有Gcd(F[j],F[i])=F[j]

则此时F[Gcd(j,i)]=F[j]

若Gcd(j,i)==j,则j|i

若Gcd(j,i)!=j,由于斐波那契数列中相等的两项只有F[1]=F[2]=1,故有i=2k+1,j=2

那么我们只要求出i的约数个数和约数平方和即可,如果i是奇数,约数个数要+1,平方和要+4

然后就是线性筛的问题了- - 熟悉约数和筛法的应该不难YY出这两个东西怎么筛吧- - 我不赘述了吧- -

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 10001000
#define MOD 1000000007
using namespace std;
int prime[1001001],tot;
int cnt[M],a[M],p_a[M];
long long sigma_p_2i[M],square_sum[M];
bool not_prime[M];
//a[n]表示n的最小质因数的次数
//p_a[n]表示n的最小质因数的a[n]次
//sigma_p_2i[n]表示Σ[0<=i<=a]p^2i
long long ans1,ans2;
void Linear_Shaker()
{
	int i,j;
	cnt[1]=1;square_sum[1]=1;
	for(i=2;i<=10000000;i++)
	{
		if(!not_prime[i])
		{
			prime[++tot]=i;
			cnt[i]=2;
			a[i]=1;
			p_a[i]=i;
			square_sum[i]=sigma_p_2i[i]=(long long)i*i+1;
		}
		for(j=1;prime[j]*i<=10000000;j++)
		{
			not_prime[prime[j]*i]=1;
			if(i%prime[j]==0)
			{
				cnt[prime[j]*i]=cnt[i]/(a[i]+1)*(a[i]+2);
				a[prime[j]*i]=a[i]+1;
				p_a[prime[j]*i]=p_a[i]*prime[j];
				sigma_p_2i[prime[j]*i]=sigma_p_2i[i]+(long long)p_a[prime[j]*i]*p_a[prime[j]*i];
				square_sum[prime[j]*i]=square_sum[i]/sigma_p_2i[i]*sigma_p_2i[prime[j]*i];
				break;
			}
			cnt[prime[j]*i]=cnt[i]<<1;
			a[prime[j]*i]=1;
			p_a[prime[j]*i]=prime[j];
			sigma_p_2i[prime[j]*i]=(long long)prime[j]*prime[j]+1;
			square_sum[prime[j]*i]=square_sum[i]*((long long)prime[j]*prime[j]+1);
		}
	}
}
void Check()
{
	int i,j;
	for(i=1;i<=10000000;i++)
	{
		int _cnt=0;long long _square_sum=0;
		for(j=1;j*j<=i;j++)
			if(i%j==0)
			{
				_cnt++,_square_sum+=(long long)j*j;
				if(j*j!=i)
					_cnt++,_square_sum+=(long long)(i/j)*(i/j);
			}
		if(_cnt!=cnt[i]||_square_sum!=square_sum[i])
			printf("%d\n",1/0);
	}
}
int main()
{
	Linear_Shaker();
	//Check();
	int T;
	long long n,a,b,c;
	for(cin>>T>>n>>a>>b>>c;T--;n=(n*a+b)%c+1)
	{
		if(~n&1)
			(ans1+=cnt[n])%=MOD,(ans2+=square_sum[n])%=MOD;
		else
			(ans1+=cnt[n]+1)%=MOD,(ans2+=square_sum[n]+4)%=MOD;
	}
	cout<<ans1<<endl<<ans2<<endl;
	return 0;
}
时间: 2024-11-05 15:58:31

BZOJ 2813 奇妙的Fibonacci 线性筛的相关文章

BZOJ 2813: 奇妙的Fibonacci

2813: 奇妙的Fibonacci Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 497  Solved: 134[Submit][Status][Discuss] Description Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + Fi-2 (当 i >= 3) pty忽然对这个古老的数列产生了浓厚的兴趣,他想知道:对于某一个Fibonacci数Fi, 有多少个Fj

BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=1000000

BZOJ 3823 定情信物 线性筛乘法逆元

题目大意:n维多面体中有多少n-1维,n-2维,n-3维...1维元素,求他们的异或和并%p. 思路:考试题,当时做的时候不会线性筛乘法逆元,就得了70分... 算法和标程不太一样,标程好象是递推,但是我空间想象力不够,没推出来..只能找规律了..花了一个半小时才找出来的规律.. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #defin

BZOJ 1409 Password 矩阵乘法+线性筛

题目大意:求p^F[n] mod q 其中F是斐波那契数列,p是质数,q<p 由于pq互质因此可以套用欧拉定理 然后就是矩乘求斐波那契的事情了- - 垃圾题卡O(√q) 求Phi的时候要枚举质数 不能一个一个枚举 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const long long empty[

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

BZOJ 3288 Mato矩阵 线性筛

题目大意:一个M*M的矩阵,(i,j)位置上的值是gcd(i,j),问这个矩阵的行列式的值. 思路:考试的时候考了这个题,有人居然打表发现规律,简直跪啊... 其实用高斯消元之后不难发现,要求的就是从1到m的phi的乘积,一个线性筛就解决了. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1000010 #defi

BZOJ 2241 SDOI2011 打地鼠 线性筛+二阶差分

首先声明:此题不满足二分条件,一切写二分的题解均为误解 请注意辨明! 题目大意:给定一个m*n的洞穴矩阵,每个洞穴里面有若干地鼠,我们需要选定一个r*c的锤子进行击打,每次击打必须保证r*c的范围内所有洞穴均有地鼠,且每次击打只会打掉每个洞穴恰好一只地鼠,求最小击打次数 m,n<=100 考虑一个1*8的洞穴,当我们把锤子设作1*4时可以完成击打,而1*3不能 故不满足单调性,二分不正确 但是一个性质是确定的:假设我们选定一个3*4的锤子可以完成击打,那么我们选定一个3*2的锤子也一定能完成击打

BZOJ 1968 AHOI2005 COMMON 约数研究 线性筛

题目大意:求n以内所有数的约数个数和 100W,n√n别想了 线性筛可以处理,对于每个数记录最小质因数的次数 令factoral[i]为i的因数个数 cnt[i]为i的最小质因数的次数 若i为质数 则factoral[i]=2 cnt[i]=1 若i%prime[j]!=0 则factoral[prime[j]*i]=factorial[i]*2 cnt[prime[j]*i]=1 若i%prime[j]==0 则factorial[prime[j]*i]=factorial[i]/(cnt[i

BZOJ 2190 SDOI 2008 仪仗队 线性欧拉筛

标题效果:有一个格子组件图,假设三个人在一条直线上,那么第一个人将不会看到第三人.现在,有一个人站在(1,1)在.我问他是否能看到n*n的人数的矩阵. 思考:如果你想站(1,1)这名男子看到了一个立场(x,y)一个人.gcd(x,y) == 1,这是一个经典的模型,仅仅要求出n以内phi的和就能够了. 方法就是线性筛. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <