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...

代码:

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. //by NeighThorn
  6. using namespace std;
  7.  
  8. const int maxn=10000000+5,mod=1e9+7;
  9.  
  10. int a,b,c,q,q1,tot,ans1,ans2,vis[maxn],pri[maxn],cnt[maxn],Min[maxn],sum[maxn],els[maxn];
  11.  
  12. inline void prework(void){
  13. cnt[1]=sum[1]=1;
  14. for(int i=2;i<=10000000;i++){
  15. if(!vis[i])
  16. pri[++tot]=i,Min[i]=els[i]=1,cnt[i]=2,sum[i]=1LL*i*i%mod+1;
  17. for(int j=1;j<=tot&&i*pri[j]<=10000000;j++){
  18. vis[i*pri[j]]=1;
  19. if(i%pri[j]==0){
  20. Min[i*pri[j]]=Min[i]+1;els[i*pri[j]]=els[i];
  21. cnt[i*pri[j]]=(cnt[i]/(Min[i]+1))*(Min[i*pri[j]]+1);
  22. sum[i*pri[j]]=(1LL*sum[i]*pri[j]%mod*pri[j]%mod+sum[els[i]])%mod;
  23. break;
  24. }
  25. cnt[i*pri[j]]=cnt[i]+1,Min[i*pri[j]]=1;
  26. els[i*pri[j]]=i;cnt[i*pri[j]]=cnt[i]<<1;
  27. sum[i*pri[j]]=(sum[i]+1LL*sum[i]*pri[j]%mod*pri[j]%mod)%mod;
  28. }
  29. }
  30. }
  31.  
  32. signed main(void){
  33. ans1=ans2=0;prework();
  34. scanf("%d%d%d%d%d",&q,&q1,&a,&b,&c);a%=c,b%=c;
  35. for(int i=1;i<=q;i++){
  36. if(i>1)
  37. q1=(1LL*q1*a+b)%c+1;
  38. (ans1+=cnt[q1]+(q1&1))%mod,(ans2+=sum[q1]+(q1&1)*4)%=mod;
  39. }
  40. printf("%d\n%d\n",ans1,ans2);
  41. return 0;
  42. }

  


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. 初识Java程序,编写简单代码?

    Dear All: 初识Java程序,编写简单代码? 首先小编在这里说下我们今天编写Java程序使用的是 eclipse 开发工具! 1.下载eclipse 官网地址:http://www.eclip ...

  2. JAVA 优先获取外网Ip,再获取内网Ip

    1.获取内网Ip private String getLocalhostIp(){ String hostAddress = ""; try { InetAddress addre ...

  3. JavaScript(E5,6) 正则学习总结学习,可看可不看!

    1.概述 正则表达式(实例)是一种表达文本模式(即字符串结构)的方法. 创建方式有两种方式: 一种是使用字面量,以斜杠表示开始和结束. var regex = /xyz/ 另一种是使用RegExp构造 ...

  4. 二 python并发编程之多进程-重点

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  5. vue.js 一(基础环境搭建)

    之前由于看了React的东西,写了两篇React的脚手架搭建,一是给自己记一点可用的东西,免得每次都去找,毕竟搭建环境在项目相对固定的时期不是经常要干的事情,一段时间不用就会忘记了. 前端的js框架还 ...

  6. myeclipse10.5 crack(2012-12-27-bd 写的日志迁移

    首先去网上下一个破解文件如图: 解压过后打开的文件夹如图: 再打开crack文件夹如图: 运行run.bat如果点击它没反应就是你没有安装jdk,它如果运行就如图所示: 到这一步就在第一个方框user ...

  7. A1042 Shuffling Machine (20)

    1042 Shuffling Machine (20)(20 分) Shuffling is a procedure used to randomize a deck of playing cards ...

  8. ACM模板

    #include <iostream> //万能头文件#include<bits/stdc++.h> 方便时用 #include <algorithm> #incl ...

  9. Linux系统软件包之---Apache

    当前互联网主流web服务说明 静态服务: apache 中小型静态web服务的主流,web服务器中的老大哥 nginx 大型新兴网站静态web服务主流,web服务器中的初生牛犊 lighttpd 静态 ...

  10. Codeforces 653G Move by Prime 组合数学

    题意: 有一个长度为\(n\)的正整数序列\(a\),有这样一种操作: 每次可以选序列中的某一个数乘上或除以某一个素数. 求对于每一个子序列使其所有元素相等的最少操作次数之和. 分析: 因为两个素数之 ...