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;
}

【BZOJ2813】奇妙的Fibonacci的更多相关文章

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

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

  2. BZOJ 2813: 奇妙的Fibonacci

    2813: 奇妙的Fibonacci Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 497  Solved: 134[Submit][Status][ ...

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

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

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

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

  5. bzoj AC倒序

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

  6. Noip模拟73 2021.10.10

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

  7. BZOJ_2813_奇妙的Fibonacci_线性筛

    BZOJ_2813_奇妙的Fibonacci_线性筛 Description Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + ...

  8. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  9. #26 fibonacci seqs

    Difficulty: Easy Topic: Fibonacci seqs Write a function which returns the first X fibonacci numbers. ...

随机推荐

  1. oracle的多表合并查询-工作心得

    本随笔文章,由个人博客(鸟不拉屎)转移至博客园 发布时间: 2018 年 11 月 29 日 原地址:https://niaobulashi.com/archives/oracle-select-al ...

  2. 自动分配ip的方法- 【Linux】

    1.  查看本机无线网络使用的网卡 2.  设置vbox的网络连接为桥接,并选择本机无线网络对应的网卡 3.  进入系统,输入ifconfig命令,记录下系统的HWaddr 4.  修改系统ip配置文 ...

  3. CHAPTER 25 The Greatest Show on Earth 第25章 地球上最壮观的演出

    CHAPTER 25 The Greatest Show on Earth 第25章 地球上最壮观的演出 Go for a walk in the countryside and you will f ...

  4. DNS分离解析IPV6与IPV4用户

    IPV6改造中经常会遇到,网站使用了CDN,但是CDN厂商还不支持IPV6的情况,而AAAA.A.CNAME记录互相冲突,想实现IPV6用户得到AAAA记录,IPV4用户得到CNAME记录的需求. 解 ...

  5. Nginx反向代理负载均衡配置

    1.反向代理概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...

  6. 高可用OpenStack(Queen版)集群-6.Nova控制节点集群

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  7. UI设计学习笔记(7-12)

    UI学习笔记(7)--扁平化图标 认识扁平化 Flat Design 抛弃传统的渐变.阴影.高光等拟真视觉效果,打造看上去更平的界面.(颜色.形状) 扁平化图标有什么优缺点 优点: 简约不简单.有新鲜 ...

  8. C++指定位数小数输出

    关键词:头文件<iomanip>,指令setw(x),fixed,setprecision(x). setw()这个指令也可以配合setfill('')用于对齐输出,详情见另一篇博客htt ...

  9. CentOS赋予一个普通用户root权限

    http://www.linuxidc.com/Linux/2012-07/64530.htm

  10. React的setState分析

    前端框架层出不穷,不过万变不离其宗,就是从MVC过渡到MVVM.从数据映射到DOM,angular中用的是watcher对象,vue是观察者模式,react就是state了. React通过管理状态实 ...