【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\)的意义下观察一些斐波那契数列:
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\)的因数个数、因数平方和,是线性筛的基本应用。因数平方和的表达式是
\]
记录每个数的最小质因子的幂、除尽最小质因子的数\(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;
}
【BZOJ2813】奇妙的Fibonacci的更多相关文章
- bzoj千题计划204:bzoj2813: 奇妙的Fibonacci
http://www.lydsy.com/JudgeOnline/problem.php?id=2813 若j能整除i,则f[j]能整除f[i] 题目就变成了求约数个数和.约数的平方和 http:// ...
- BZOJ 2813: 奇妙的Fibonacci
2813: 奇妙的Fibonacci Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 497 Solved: 134[Submit][Status][ ...
- 关于奇妙的 Fibonacci 的一些说明
奇妙的 Fibonacci,多次模拟赛中出现 同时也是 BZOJ 2813 一 Fibonacci 的 GCD 如果 \(F\) 是 Fibonacci 数列,那么众所周知的有 \(\gcd(F_i, ...
- 【bzoj2813】 奇妙的Fibonacci数列 线性筛
Description Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + Fi-2 (当 i >= 3) pty忽然对这个 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Noip模拟73 2021.10.10
老妈送来了防寒补给就很棒,再也不用晚上盖两层毛巾被了,再也不用担心晚上自动把毛巾被$split$了 还有一些好吃的耶叶 T1 小L的疑惑 考场上疑惑的切掉了 直接把$a$排序然后处理前缀和的过程中判断 ...
- BZOJ_2813_奇妙的Fibonacci_线性筛
BZOJ_2813_奇妙的Fibonacci_线性筛 Description Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- #26 fibonacci seqs
Difficulty: Easy Topic: Fibonacci seqs Write a function which returns the first X fibonacci numbers. ...
随机推荐
- CentOS查看一共安装了多少软件包,是那些软件包
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48292853 一.如何得知共安装了多少个软件包 [root@localhost ~ ...
- pytorch 如何使用tensorboard实时查看曲线---- tensorboardX简介
用惯了tensorflow的小伙伴肯定都用过tensorboard工具吧.虽然Facebook也推出了visdom,但是在一次不小心误触clear之后,我放弃了这个工具(页面的一个clear按钮我本来 ...
- kerkee demo编译连接过程中遇到的问题及解决方法(iOS)
https://github.com/kercer/kerkee_ios 1.刚打开这个demo的时候是下图这个样子的,我们很自然的可以想到将kerkee.xcoderproj添加到项目里面 2.将k ...
- oracle查看用户表
select table_name from user_tables;
- Team Member Introduction and Division of Work
Team leader Name:宋天舒 Student Number:12061166 Interested In: Information safety. Responsible For: Des ...
- Scrum Meeting 10.26
1.会议内容 姓名 今日任务 明日任务 预估时间(h) 徐越 学习服务器配置 配置SQLserver 4 卞忠昊 阅读代码 找上届代码的bug 3 武鑫 查阅资料 查阅资料,各种app的界面设计 3 ...
- SQLyog的基本使用
[简介] SQLyog是mysql数据库的客户端软件 [基本使用] 1.连接mysql数据库 2.SQLyog的页面使用介绍 3.基本的数据库命令 1) use命令 切换数据库 2) unsigned ...
- prototype原型(待完善)
模式:prototype 解决向量的深浅克隆 #pragma once #ifndef _PROTOTYPE_H_ #define _PROTOTYPE_H_ class Prototype{ pu ...
- Software Defined Networking(Week 2, part 3)
Control of Packet-switch Network 我们已经讨论过中心控制网络的原理,但主要是以电话网络做模型的.现在我们来看看对于分组交换网络的控制是如何改进的. Why Separa ...
- JTS
在这个系列的 第 1 部分,我们讨论了事务并研究了它们的基本属性 ― 原子性(atomicity).一致性(consistency).孤立性(isolation)和持久性(durability).事务 ...