【BZOJ2813】奇妙的Fibonacci
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相关推荐
- Fibonacci 数列
斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...
- 斐波那契数列 (Fibonacci) 多种实现方法(Python)与详细介绍
斐波那契数列 Fibonacci Sequence 本文介绍了多种方式得到斐波那契数列或斐波那契数.斐波那契数列也称为"兔子数列".来源于兔子繁殖的预测.它的重要性体现在相邻两数之 ...
- Fibonacci数列学习笔记
无意中在网上看到Fibonacci数列的文章,就又重新学习了一把. 这里是来在维基百科上的关于Fibonacci数列的介绍: 在数学上,斐波那契数列是以递归的方法来定义: F0 = 0 F1 = 1 ...
- Fibonacci数列的java实现
关于Fibonacci应该都比较熟悉,0,1,1,2,3..... 基本公式为f(n) = f(n-1) + f(n-2); f(0) = 0; f(1) =1; 方法1:可以运用迭代的方法实现: p ...
- ZOJ 2723 Semi-Prime ||ZOJ 2060 Fibonacci Again 水水水!
两题水题: 1.如果一个数能被分解为两个素数的乘积,则称为Semi-Prime,给你一个数,让你判断是不是Semi-Prime数. 2.定义F(0) = 7, F(1) = 11, F(n) = F( ...
- Codeforces Round #FF 446 C. DZY Loves Fibonacci Numbers
參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...
- (C++)求Fibonacci数列的第n个数的两种方法
方法一 #include<cstdio> #include<cmath>int main(){int n;scanf("%d",&n);if(n== ...
- c++ 开方_刷屏时尚圈!The Story Shoulder稳坐风尚C位的背后究竟有什么奇妙魔力?...
不知道大家还记不记得白哥去年背的一款来自Alexander McQueen的The Story手袋:当时你白形容说:"它处处散发着麦昆式的Woman Power".这只采用了极简设 ...
- H - Fibonacci POJ - 3070 (矩阵快速幂)
H - Fibonacci POJ - 3070 (矩阵快速幂) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and ...
最新文章
- g2o入门——g2o的基本使用方法
- 开源Jekyll助您构建你的网站
- Spring Boot 实现多图片上传并回显,涨姿势了~
- thinkphp学习笔记10—看不懂的路由规则
- ie关闭浏览器tab提示信息
- Linux系统起源及主流发行版
- springboot-web开发(静态资源)
- Linux学习笔记6——文本处理相关命令
- 自定义分页模板(银角大王版)
- Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装
- 【渝粤题库】陕西师范大学200301几何学作业(高起本)
- 精华文稿 | 工业场景中机器人定位导航技术
- Rman创建DG环境
- WPA2 Key Reinstallation 漏洞
- PMP考试参加培训一定能过吗?
- C#在word中插入表格(包含从excel中选取表格插入到word中)
- android+获取电池信息,Delphi XE5 Android应用程序获取电池信息
- torch.mul torch.bmm
- 内网安全学习(六)—域横向-内网漫游: Socks 代理
- 关于Ubuntu14.04拼音不能正常使用的解决方案
热门文章
- 一个技术开发者经常访问的网站
- java int和String类型之间的相互转换
- Centos YUM国内163源
- C#正则的委托和lambda表达式用法
- linux下解压命令.7z,CentOS 下安装7-Zip 以及常用的解压命令
- 人类一败涂地电脑版_iOS账号分享 |人类一败涂地 我们继续相爱相杀,PC大火游戏移植!...
- RedHat7修改主机名hostname
- 查看tensor的形状,行列大小
- ArcGIS GeoDataBase GeoDataset dataset
- 树状数组入门(有被精简的树状数组所震撼到)