jzoj4015-数列【循环节,数论】
正题
题目链接:https://jzoj.net/senior/#contest/show/3011/0
题目大意
给出n,m,a,b,c,x0n,m,a,b,c,x_0n,m,a,b,c,x0
xi=axi−12+bxi−1+cx_i=ax_{i-1}^2+bx_{i-1}+cxi=axi−12+bxi−1+c
求xn%mx_n\%mxn%m
解题思路
第一段n≤1e6n\leq 1e6n≤1e6直接O(n)O(n)O(n)暴力做
第二段m≤1e6m\leq 1e6m≤1e6找到一个循环节然后在套到n里
第三段:
xi=axi−12+bxi−1+cx_i=ax_{i-1}^2+bx_{i-1}+cxi=axi−12+bxi−1+c
学过二次函数的对于给出的性质有敏锐的直觉
xi=a(x+b2a)2+4ac−b24ax_i=a(x+\frac{b}{2a})^2+\frac{4ac-b^2}{4a}xi=a(x+2ab)2+4a4ac−b2
4ac=b2−2b⇒4ac−b2=2b4ac=b^2-2b\Rightarrow 4ac-b^2=2b4ac=b2−2b⇒4ac−b2=2b
xi=a(x+b2a)2−b2ax_i=a(x+\frac{b}{2a})^2-\frac{b}{2a}xi=a(x+2ab)2−2ab
然后定义k=b2ak=\frac{b}{2a}k=2ab
xi+k=a(x+k)2x_i+k=a(x+k)^2xi+k=a(x+k)2
同时乘上aaa
a(xi+k)=(a(x+k))2a(x_i+k)=(a(x+k))^2a(xi+k)=(a(x+k))2
定义yi=a(xi+k)y_i=a(x_i+k)yi=a(xi+k)
那么有yi=yi−12y_i=y_{i-1}^2yi=yi−12
即yn=y02ny_n=y_{0}^{2^n}yn=y02n
用费马小可以让指数摸上m−1m-1m−1计算出yny_nyn,然后倒推出xnx_nxn
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll M=1e6+10;
ll n,m,a,b,c,x,fa[M],cir[M],v[M];
void solve1(){for(ll i=1;i<=n;i++)x=(a*x%m*x%m+b*x%m+c)%m;printf("%lld",x);
}
void solve2(){x%=m;for(ll i=0;i<=m;i++)fa[i]=(a*i%m*i%m+b*i%m+c)%m;ll cnt=0;cir[0]=x;v[x]=1;while(!v[x=fa[x]])cir[++cnt]=x,v[x]=cnt;x=v[x];if(n<=cnt) printf("%lld",cir[n]);else{n-=x;printf("%lld",cir[x+n%(cnt-x+1)]);}
}
ll power(ll x,ll b,ll p){ll ans=1;while(b){if(b&1) ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
void solve3(){ll z=b/2/a,y=a*(x+z)%m;y=power(y,power(2,n,m-1),m);printf("%lld",(y*power(a,m-2,m)%m-z+m)%m);
}
int main()
{scanf("%lld%lld%lld%lld%lld%lld",&x,&a,&b,&c,&n,&m);x=x%m;a%=m;b%=m;c%=m;if(n<=1e6)solve1();else if(m<=1e6)solve2();else solve3();
}
jzoj4015-数列【循环节,数论】相关推荐
- 2018年东北农业大学春季校赛 K wyh的数列【数论/斐波那契数列大数取模/循环节】...
链接:https://www.nowcoder.com/acm/contest/93/K 来源:牛客网 题目描述 wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F ...
- 广义Fibonacci数列找循环节
今天将来学习如何求广义Fibonacci数列的循环节. 问题:给定,满足,求的循 环节长度. 来源:http://acdreamoj.sinaapp.com/ 1075题 分析:我们知道矩阵的递推 ...
- luogu 1327 数列排序 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节
luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...
- 牛客 - 交换(思维+找循环节)
题目链接:点击查看 题目大意:给出一个数列 n ,要求通过交换使其从小到大排序的最小次数 题目分析:第一反应是求逆序对,把之前做过的题目贴过来结果只过了 10% ,静下心来又读了一下题,发现这个题目要 ...
- Fib数模n的循环节
我们知道Fibonacci数列,现在我们来求一个Fib数模n的循环节的长度. 对于一个正整数n,我们求Fib数模n的循环节的长度的方法如下: (1)把n素因子分解,即 (2)分别计算Fib数模每个的循 ...
- UVa 202 - Repeating Decimals —— 分数循环节
题目:计算分数的循环节. https://vjudge.net/contest/227853#problem/C 分析:数论,组合. n除以m的余数只能是0~m-1,根据抽屉原则,当计算m+1次时至少 ...
- 51Nod - 1035 最长的循环节
51Nod - 1035 最长的循环节 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有 ...
- hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
Problem - 3374 KMP求循环节. http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html 循环节推导的证明相当的好,这 ...
- 输出1/n(是循环小数的,只输出第一个循环节)
Input 第一行整数T,表示测试组数.后面T行,每行一个整数 n (1<=|n|<=10^5). Output 输出1/n. (是循环小数的,只输出第一个循环节). Sample Inp ...
最新文章
- Centos源码安装Cmake
- VTK:IO之ReadPNM
- java中的equals拿什么鞋的_Java中==和equals方法
- 开始使用gitlab
- 各大媒体优劣对比_信息流投放广告丨各大平台的信息流都有什么特点与弊端
- 科一主观题刷题 0308
- css索引_CSS中的Z索引:它是什么以及它做什么
- 创意油墨飞溅效果的绿树矢量素材
- pfSense修改mbuf值
- 文件操作 详解(freopen)(C++)
- Thinkphp 6.0商城系统,B2C商城系统全新UI
- 1.2 Illustrator多文档的几种排列方式
- 基于wifi的物联网技术,主要有哪些优势?
- AsPack压缩工具
- PLC-Recorder快速监控多个PLC位的技巧
- kile编辑器有关使用说明
- HTML5 之 Form 标签
- eSIM产业动态(持续更新)
- ROS安装:一键解决人生烦恼
- 粗心店主下班忘关店门 执勤巡特警守候至凌晨
热门文章
- win10前置耳机插孔没声音_音频服务未运行怎么办?win7和win10电脑没声音了恢复方法...
- mysql 批量_mysql LOAD语句批量录入数据
- 京东面试官:呦,你对中间件 Mycat了解的还挺深~
- 命中率_数据说话!詹姆斯的“皇家射手团”命中率为近十年最低
- 使有用计算机不注意卫生,保护眼睛注意细节有哪些
- java疯狂讲义内存分配_java疯狂讲义学习:面向对象(上)
- java opencsv_用opencsv文件读写CSV文件
- c++——优先队列(priority_queue)
- PyTorch深度学习实践
- 后端学习 - Redis