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 \le 3*10^6,C \le10^7,A \le10^7,B \le10^7,1 \le Q1\le C $
  
  
  

Solution

  
​  首先还是要找规律。发现\(f_j|f_i\Leftrightarrow j|i\)。
  
  对于任意一个质数\(p\),我们在模\(f_p\)的意义下观察一些斐波那契数列:
\[ \begin{bmatrix} f_1&f_2&f_3&...&f_{p-1}&0&f_{p-1}&f_{p-1}&2f_{p-1}&...\\ f_1&f_2&f_3&...&f_{p-1}&0&f_{p-1}f_1&f_{p-1}f_2&f_{p-1}f_3&...&f_{p-1}f_{p-1}&0&f_{p-1}^2f_1... \end{bmatrix} \]
  斐波那契数列会每\(p\)项分成一段,其中第\(i\)段是\(f_{p-1}^{i-1}f_{1..p}\)。
  
  由于\(f_{p-1}\)与\(f_p\)互质,因此\(f_{p-1}^{i-1}\)都与\(f_p\)互质。既然第一段只能在第\(p\)项,也就是该段最后一项取0,那么之后的每一段都只能在最后一项取0.
  
  也就是说\(f_p\)整除哪一些\(f_i\)呢?恰好是那些\(p|i\)的\(f_i\)。
  
​  那么对于任意整数\(j\),\(f_j\)整除哪一些\(f_i\)呢?把\(j\)质因数分解\(j=p_1^{q_1}p_2^{q_2}...p_m^{q_m}\),可知\(f_{p_k}|f_j\)(\(k\in[1,m]\))。当且仅当\(f_{p_k}|f_i\)(\(k\in[1,m]\))时,有\(f_j|f_i\),而此时\(p_k|i\)(\(k\in[1,m]\))。
  
​  故证毕:对于任意正整数\(i\)和\(j\),有\(f_j|f_i\Leftrightarrow j|i\)。
  
​  所以本题相当于询问\(q\)的因数个数、因数平方和,是线性筛的基本应用。因数平方和的表达式是
\[ \sigma(x)^2=\prod_{i=1}^m(\sum_{j=0}^{q_i}p_i^{2j}) \]
  记录每个数的最小质因子的幂、除尽最小质因子的数\(nop\)就可以计算了。我第一次写的代码使用了快速幂计算\(i\%p==0\)时的累加,然而不必要,对\(\sigma^2(i)\)乘上\(p^2\)就可以把最小质因子处的\(\sum\)整体偏移,括号里需要加上的1,対整体加上\(\sigma^2(nop[i])\)即可。
  
​  注意回答询问时,不可直接输出上述统计的东西。\(f_2=1\)非常特殊,当询问\(q\)为偶数时,因为\(2|q\),所以2会被统计到,且2本来就需要统计,因为\(f_2|f_q\)是合法的的。但是当询问\(q\)为奇数时,\(2\nmid q\),所以2未被统计,但从原题意义上看,依然有\(f_2|f_q\),2应该被统计。所以\(q\)是奇数时,第一问要加上1,第二问要加上4(\(2^2=4\))。
  
  我脑残,都加上了1,居然还有50......说明那些数据模数神奇,询问都是偶数。
  
    
  

Code

  

#include <cstdio>
using namespace std;
typedef long long ll;
const int N=10000001,MOD=1e9+7;
bool vis[N];
int p[N],pcnt,sigma0[N],minpq[N];
ll nop[N],sigma2[N];
ll ans1,ans2;
void sieve(){sigma0[1]=1; sigma2[1]=1;for(int i=2;i<N;i++){if(!vis[i]){p[++pcnt]=i;sigma0[i]=2;sigma2[i]=(1LL*i*i+1)%MOD;minpq[i]=1;nop[i]=1;}for(int j=1;j<=pcnt&&i*p[j]<N;j++){int x=i*p[j];vis[x]=true;if(i%p[j]==0){minpq[x]=minpq[i]+1;nop[x]=nop[i];sigma0[x]=sigma0[i]/(minpq[i]+1)*(minpq[x]+1);sigma2[x]=(sigma2[i]*(1LL*p[j]*p[j]%MOD)%MOD+sigma2[nop[i]])%MOD;break;}sigma0[x]=sigma0[i]*sigma0[p[j]];sigma2[x]=sigma2[i]*sigma2[p[j]]%MOD;minpq[x]=1;nop[x]=i;}}
}
int main(){sieve();int n,q,qlast=0,a,b,c;scanf("%d%d%d%d%d",&n,&q,&a,&b,&c); for(int i=1;i<=n;i++){if(i>1) q=(1LL*qlast*a+b)%c+1;qlast=q;ans1+=sigma0[q]+(q&1);(ans2+=sigma2[q]+4*(q&1))%=MOD;}printf("%lld\n%lld\n",ans1,ans2);return 0;
}

转载于:https://www.cnblogs.com/RogerDTZ/p/9216477.html

【BZOJ2813】奇妙的Fibonacci相关推荐

  1. Fibonacci 数列

    斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...

  2. 斐波那契数列 (Fibonacci) 多种实现方法(Python)与详细介绍

    斐波那契数列 Fibonacci Sequence 本文介绍了多种方式得到斐波那契数列或斐波那契数.斐波那契数列也称为"兔子数列".来源于兔子繁殖的预测.它的重要性体现在相邻两数之 ...

  3. Fibonacci数列学习笔记

    无意中在网上看到Fibonacci数列的文章,就又重新学习了一把. 这里是来在维基百科上的关于Fibonacci数列的介绍: 在数学上,斐波那契数列是以递归的方法来定义: F0 = 0 F1 = 1 ...

  4. Fibonacci数列的java实现

    关于Fibonacci应该都比较熟悉,0,1,1,2,3..... 基本公式为f(n) = f(n-1) + f(n-2); f(0) = 0; f(1) =1; 方法1:可以运用迭代的方法实现: p ...

  5. ZOJ 2723 Semi-Prime ||ZOJ 2060 Fibonacci Again 水水水!

    两题水题: 1.如果一个数能被分解为两个素数的乘积,则称为Semi-Prime,给你一个数,让你判断是不是Semi-Prime数. 2.定义F(0) = 7, F(1) = 11, F(n) = F( ...

  6. Codeforces Round #FF 446 C. DZY Loves Fibonacci Numbers

    參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...

  7. (C++)求Fibonacci数列的第n个数的两种方法

    方法一 #include<cstdio> #include<cmath>int main(){int n;scanf("%d",&n);if(n== ...

  8. c++ 开方_刷屏时尚圈!The Story Shoulder稳坐风尚C位的背后究竟有什么奇妙魔力?...

    不知道大家还记不记得白哥去年背的一款来自Alexander McQueen的The Story手袋:当时你白形容说:"它处处散发着麦昆式的Woman Power".这只采用了极简设 ...

  9. H - Fibonacci POJ - 3070 (矩阵快速幂)

    H - Fibonacci POJ - 3070 (矩阵快速幂) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and ...

最新文章

  1. g2o入门——g2o的基本使用方法
  2. 开源Jekyll助您构建你的网站
  3. Spring Boot 实现多图片上传并回显,涨姿势了~
  4. thinkphp学习笔记10—看不懂的路由规则
  5. ie关闭浏览器tab提示信息
  6. Linux系统起源及主流发行版
  7. springboot-web开发(静态资源)
  8. Linux学习笔记6——文本处理相关命令
  9. 自定义分页模板(银角大王版)
  10. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装
  11. 【渝粤题库】陕西师范大学200301几何学作业(高起本)
  12. 精华文稿 | 工业场景中机器人定位导航技术
  13. Rman创建DG环境
  14. WPA2 Key Reinstallation 漏洞
  15. PMP考试参加培训一定能过吗?
  16. C#在word中插入表格(包含从excel中选取表格插入到word中)
  17. android+获取电池信息,Delphi XE5 Android应用程序获取电池信息
  18. torch.mul torch.bmm
  19. 内网安全学习(六)—域横向-内网漫游: Socks 代理
  20. 关于Ubuntu14.04拼音不能正常使用的解决方案

热门文章

  1. 一个技术开发者经常访问的网站
  2. java int和String类型之间的相互转换
  3. Centos YUM国内163源
  4. C#正则的委托和lambda表达式用法
  5. linux下解压命令.7z,CentOS 下安装7-Zip 以及常用的解压命令
  6. 人类一败涂地电脑版_iOS账号分享 |人类一败涂地 我们继续相爱相杀,PC大火游戏移植!...
  7. RedHat7修改主机名hostname
  8. 查看tensor的形状,行列大小
  9. ArcGIS GeoDataBase GeoDataset dataset
  10. 树状数组入门(有被精简的树状数组所震撼到)