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

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

  1. 关于奇妙的 Fibonacci 的一些说明

    奇妙的 Fibonacci,多次模拟赛中出现 同时也是 BZOJ 2813 一 Fibonacci 的 GCD 如果 \(F\) 是 Fibonacci 数列,那么众所周知的有 \(\gcd(F_i, ...

  2. bzoj千题计划204:bzoj2813: 奇妙的Fibonacci

    http://www.lydsy.com/JudgeOnline/problem.php?id=2813 若j能整除i,则f[j]能整除f[i] 题目就变成了求约数个数和.约数的平方和 http:// ...

  3. 【BZOJ】1987: Zju2672 Fibonacci Subsequence

    题意 给出一个序列\(A\),求一个最长的满足fib性质的子序列,输出其长度及其元素(如果多种方案,输出位置最靠前的).(\(n \le 3000\)) 题解 容易想到dp,即\(d(i, j)\)表 ...

  4. 【BZOJ2813】奇妙的Fibonacci

    Description ​ Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + Fi-2 (当 i >= 3) ​ pty忽 ...

  5. 【bzoj2813】 奇妙的Fibonacci数列 线性筛

    Description Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + Fi-2 (当 i >= 3) pty忽然对这个 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. Noip模拟73 2021.10.10

    老妈送来了防寒补给就很棒,再也不用晚上盖两层毛巾被了,再也不用担心晚上自动把毛巾被$split$了 还有一些好吃的耶叶 T1 小L的疑惑 考场上疑惑的切掉了 直接把$a$排序然后处理前缀和的过程中判断 ...

  8. 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 } 这里+的定义是字符串的 ...

  9. BZOJ [Poi2012]Fibonacci Representation

    找最近的数 记忆化 (我也不知道为什么对的) #include<cstdio> #include<algorithm> #include<map> using na ...

随机推荐

  1. XML字符串解析

    不多说,直接上代码: import java.io.StringReader; import org.dom4j.Document; import org.dom4j.DocumentExceptio ...

  2. Head First Python (一)

    建立一个数组: cast = ["Cleese","Palin","Jones","Idle"] 列出数组有多少数据项: ...

  3. 使用 CAST

    使用 CAST: CAST ( expression AS data_type ) 使用 CONVERT: CONVERT (data_type[(length)], expression [, st ...

  4. Codeforces Round #271 (Div. 2) D Flowers【计数dp】

    D. Flowers time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input ...

  5. 2017 United Kingdom and Ireland Programming(Gym - 101606)

    题目很水.睡过了迟到了一个小时,到达战场一看,俩队友AC五个了.. 就只贴我补的几个吧. B - Breaking Biscuits Gym - 101606B 旋转卡壳模板题.然后敲错了. 代码是另 ...

  6. Patrick and Shopping

    Patrick and Shopping 今天 Patrick 等待着他的朋友 Spongebob 来他家玩.为了迎接 Spongebob,Patrick 需要去他家附近的两家商店  买一些吃的.他家 ...

  7. wim

    wim 编辑 WIM是英文Microsoft Windows Imaging Format(WIM)的简称,它是Windows基于文件的映像格式.WIM 映像格式并非现在相当常见的基于扇区的映像格式, ...

  8. msconfig.exe

    msconfig.exe 编辑 本词条缺少概述.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!   中文名 微软系统配置实用程序 外文名 msconfig.exe 出品者 Micros ...

  9. tomcat内存泄漏存入dump文件

    很多tomcat进程退出(或者进程假死),都是由于频繁的抛出OutOfMemeoryError导致的. 为了让tomcat退出前或者发生OutOfMemeoryError时自动dump堆栈信息,方便事 ...

  10. Jquery 实现层的拖动,支持回调函数

    最近在写一个CMS内容管理系统,前台基本是用ajax异步请求服务器,通过ashx处理,返回json格式处理.由于需要更加人性化的界面,所以采用到了拖动层的操作. 以下是拖动层的主要核心方法,本来想写成 ...