BZOJ 2813: 奇妙的Fibonacci

2813: 奇妙的Fibonacci

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 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能够整除Fi (i可以等于j),他还想知道所有j的平方之和是多少。

Input

第一行一个整数Q,表示Q个询问。

第二行四个整数:Q1, A, B, C

第i个询问Qi = (Qi-1 * A + B) mod C + 1(当i >= 2)

Output

Ai代表第i个询问有多少个Fj能够整除FQi

Bi代表第i个询问所有j的平方之和。

输出包括两行:

第一行是所有的Ai之和。

第二行是所有的Bi之和。

由于答案过大,只需要输出除以1000000007得到的余数即可。

Sample Input

2
2 2 1 8

Sample Output

6
55

HINT

对于100%的数据保证:Q <= 3*10^6,C <= 10^7,A <= 10^7,B <= 10^7,1 <= Q1<= C

Source

分析:

打表可以发现答案就是约数个数以及约数平方和...

如果要严谨的证明就是这个定理:$gcd(f[i],f[j])=f[gcd(i,j)]$

证明如下:

定理1:$gcd(f[n],f[n+1])=1$

$gcd(f[n],f[n+1])$

$=gcd(f[n+1]-f[n],f[n])$

$=gcd(f[n],f[n-1])$

$……$

$=gcd(f[2],f[1])$

$=1$

定理2:$f[m+n]=f[m-1]f[n]+f[m]f[n+1]$

$f[m+n]$

$=f[n+m-1]+f[n+m-2]$

$=2*f[n+m-2]+f[n+m-3]$

$=a[x]*f[n+m-x]+b[x]*f[n+m-x-1]$

$=(a[x]+b[x])*f[n+m-x-1]+a[x]*f[n+m-x-2]$

如果$x=1$,则$a[x]=f[2],b[x]=f[1]$

如果$x=2$,则$a[x]=f[3],b[x]=f[2]$

如果$x=n$,则$a[x]=f[n+1],b[x]=f[n]$

所以$f[m+n]=f[m]*f[n+1]+f[n]*f[m-1]$

定理3:$gcd(f[m+n],f[n])=gcd(f[m],f[n])$

$gcd(f[m+n],f[n])$

$=gcd(f[m]*f[n+1]+f[n]*f[m-1],f[n])$

$=gcd(f[m]*f[n+1],f[n])$

$=gcd(f[n+1],f[n])*gcd(f[m],f[n])$

$=gcd(f[m],f[n])$

然后根据辗转相减法:

设$m=p _{1}*n+r _{1},n=p _{2}*r _{1}+r _{2},r_{1}=p _{3}*r _{2}+r _{3}......$

$gcd(m,n)=gcd(n,r _{1})=......=r _{x}$

$gcd(f[m],f[n])=gcd(f[n],f[r _{1}])=......f[r _{x}]=f[gcd(m,n)]$

然后约数和还有平方和线性筛的时候维护一下就好了...

因为f[2]=1,所以如果q是奇数约数和要+1,平方和要+4...

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;

const int maxn=10000000+5,mod=1e9+7;

int a,b,c,q,q1,tot,ans1,ans2,vis[maxn],pri[maxn],cnt[maxn],Min[maxn],sum[maxn],els[maxn];

inline void prework(void){
	cnt[1]=sum[1]=1;
	for(int i=2;i<=10000000;i++){
		if(!vis[i])
			pri[++tot]=i,Min[i]=els[i]=1,cnt[i]=2,sum[i]=1LL*i*i%mod+1;
		for(int j=1;j<=tot&&i*pri[j]<=10000000;j++){
			vis[i*pri[j]]=1;
			if(i%pri[j]==0){
				Min[i*pri[j]]=Min[i]+1;els[i*pri[j]]=els[i];
				cnt[i*pri[j]]=(cnt[i]/(Min[i]+1))*(Min[i*pri[j]]+1);
				sum[i*pri[j]]=(1LL*sum[i]*pri[j]%mod*pri[j]%mod+sum[els[i]])%mod;
				break;
			}
			cnt[i*pri[j]]=cnt[i]+1,Min[i*pri[j]]=1;
			els[i*pri[j]]=i;cnt[i*pri[j]]=cnt[i]<<1;
			sum[i*pri[j]]=(sum[i]+1LL*sum[i]*pri[j]%mod*pri[j]%mod)%mod;
		}
	}
}

signed main(void){
	ans1=ans2=0;prework();
	scanf("%d%d%d%d%d",&q,&q1,&a,&b,&c);a%=c,b%=c;
	for(int i=1;i<=q;i++){
		if(i>1)
			q1=(1LL*q1*a+b)%c+1;
		(ans1+=cnt[q1]+(q1&1))%mod,(ans2+=sum[q1]+(q1&1)*4)%=mod;
	}
	printf("%d\n%d\n",ans1,ans2);
	return 0;
}

  



By NeighThorn

时间: 2024-08-08 06:03:07

BZOJ 2813: 奇妙的Fibonacci的相关文章

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,

bzoj 3978: [WF2012]Fibonacci Words

Description 斐波那契01字符串的定义如下 F(n) = { 0  if n = 0 1  if n = 1 F(n-1)+F(n-2) if n >= 2 } 这里+的定义是字符串的连接.F(n)的前几个元素如下: F(0)=0 F(1)=1 F(2)=10 F(3)=101 F(4)=10110 F(5)=10110101 F(6)=1011010110110 F(7)=101101011011010110101 F(8)=10110101101101011010110110101

BZOJ 1006 HNOI2008 奇妙的国度 弦图最小染色 MCS算法

题目大意:给定一个弦图,求最小染色 弦图相关问题,详细见陈丹琦09年讲稿<弦图与区间图> PPT里有一个问题没说清楚 就是MCS算法的O(m+n)怎么来的 那个在 http://tieba.baidu.com/p/2891159900 有jcvb神犇具体的解答 至于染色怎样标号,时间戳标记暴力硬扫就可以 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>

bzoj 2506 calc 题解

[原题] 2506: calc Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 228  Solved: 112 Description 给一个长度为n的非负整数序列A1,A2,-,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个数. Input 第一行两个正整数n和m. 第二行n个数,表示A1,A2,-,An. 以下m行,每行四个数分别表示l,r,p,k.满足1<=l<=r&

2432: [Noi2011]兔农 - BZOJ

Description 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到隔壁的小朋友在讨论兔子繁殖的问题. 问题是这样的:第一个月初有一对刚出生的小兔子,经过两个月长大后,这对兔子从第三个月开始,每个月初生一对小兔子.新出生的小兔子生长两个月后又能每个月生出一对小兔子.问第n个月有多少只兔子? 聪明的你可能已经发现,第n个月的兔子数正好是第n个Fibonacci(斐波那契)数.栋栋不懂什么是Fibonacci数,但他也发现了规律:第i+2个月的兔子数等于第i个月的兔子数加上第i+1个月

【BZOJ】【1008】【HNOI】越狱

快速幂 大水题= = 正着找越狱情况不好找,那就反过来找不越狱的情况呗…… 总方案是$m^n$种,不越狱的有$m*(m-1)^(n-1)$种= = 负数搞搞就好了…… 莫名奇妙地T了好几发…… 1 /************************************************************** 2 Problem: 1008 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:0 ms 7 Memory:8

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

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】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比