bzoj 3328 : PYXFIB
Discription
Input
第一行一个正整数,表示数据组数据 ,接下来T行
每行三个正整数N,K,P
Output
T行,每行输出一个整数,表示结果
Sample Input
Sample Output
1
Hint
上个周学的一个 dark技巧: 利用单位根来 求一个多项式某个数倍数次数的项的系数和。
首先设 w[k] 为 复数域下的k次单位根,那么它满足的一个性质是: 当且仅当 k|i 的时候 ,w[k]^i = 1;其他时候都不为1。
这个有什么用处呢???
假设我们要求 杨辉三角的第n行的 是3的倍数的列的和的时候, 我们显然可以列出式子:ANS = ∑ [k|i] * C(n,i).
然后我们把 w[0]~w[k-1] 分别带进 (1+x)^n 这个多项式里,展开之后求和,显然 x^i前的系数是 C(n,i) ,并且 对于 是k的倍数的i ,w[0]^i + w[1]^i +....+w[k-1]^i = k;
而对于不是k倍数的i,我们用等比数列求一下和发现系数正好就是0。所以我们把这k个多项式的和再除以k就是要求的东西了。
对于本题其实是一样的,只不过我们把数的多项式换成矩阵的多项式就好啦。而且因为 p mod k =1,所以直接找原根然后就可以直接求k次单位根啦。
(无意间达成了一个成就2333
)
/*
利用单位根的性质,可以求出多项式某个数倍数的次数项的系数和
(I + xA)^n = ∑C(n,i) * x^i * A^i ,其中A是斐波那契数列系数矩阵
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int K,P,T,root,num,d[233],ans;
inline int add(int x,int y){ x+=y; return x>=P?x-P:x;}
inline int mul(int x,int y,const int ha){ return x*(ll)y%ha;}
inline int ksm(int x,int y){ int an=1; for(;y;y>>=1,x=mul(x,x,P)) if(y&1) an=mul(an,x,P); return an;}
struct node{
int a[2][2];
inline void clear(){ memset(a,0,sizeof(a));}
inline void BASE(){ clear(); a[0][0]=a[1][1]=1;}
node operator *(const int &u)const{
node r;
r.a[0][0]=mul(a[0][0],u,P);
r.a[0][1]=mul(a[0][1],u,P);
r.a[1][0]=mul(a[1][0],u,P);
r.a[1][1]=mul(a[1][1],u,P);
return r;
}
node operator +(const node &u)const{
node r;
r.a[0][0]=add(a[0][0],u.a[0][0]);
r.a[0][1]=add(a[0][1],u.a[0][1]);
r.a[1][0]=add(a[1][0],u.a[1][0]);
r.a[1][1]=add(a[1][1],u.a[1][1]);
return r;
}
node operator *(const node &u)const{
node r;
r.a[0][0]=add(mul(a[0][0],u.a[0][0],P),mul(a[0][1],u.a[1][0],P));
r.a[0][1]=add(mul(a[0][1],u.a[1][1],P),mul(a[0][0],u.a[0][1],P));
r.a[1][0]=add(mul(a[1][0],u.a[0][0],P),mul(a[1][1],u.a[1][0],P));
r.a[1][1]=add(mul(a[1][1],u.a[1][1],P),mul(a[1][0],u.a[0][1],P));
return r;
}
}X,ANS; inline void GD(){
int Q=P-1; num=0;
for(int i=2;i*(ll)i<=Q;i++) if(!(Q%i)){
d[++num]=i;
while(!(Q%i)) Q/=i;
if(Q==1) break;
}
if(Q!=1) d[++num]=Q;
for(int i=1;i<=num;i++) d[i]=(P-1)/d[i];
} inline void findroot(){
GD();
for(int i=2;i;i++){
bool flag=1;
for(int j=1;j<=num;j++) if(ksm(i,d[j])==1){ flag=0; break;} if(flag){ root=i; break;}
}
} inline void calc(ll C){
for(int i=0,omega=ksm(root,(P-1)/K),now=1;i<K;i++,now=mul(now,omega,P)){
X.a[0][1]=X.a[1][1]=X.a[1][0]=1,X.a[0][0]=0;
X=X*now,X.a[0][0]=add(X.a[0][0],1),X.a[1][1]=add(X.a[1][1],1); ll O=C; ANS.BASE();
for(;O;O>>=1,X=X*X) if(O&1) ANS=ANS*X; ans=add(ans,add(ANS.a[0][0],ANS.a[1][0]));
}
ans=mul(ans,ksm(K,P-2),P);
} inline void solve(){
ll N; ans=0;
scanf("%lld%d%d",&N,&K,&P);
findroot();
calc(N);
printf("%d\n",ans);
} int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}
bzoj 3328 : PYXFIB的更多相关文章
- BZOJ 3328: PYXFIB 解题报告
BZOJ 3328: PYXFIB 题意 给定\(n,p,k(1\le n\le 10^{18},1\le k\le 20000,1\le p\le 10^9,p \ is \ prime,k|(p- ...
- bzoj 3328: PYXFIB 数论
3328: PYXFIB Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 130 Solved: 41[Submit][Status][Discuss ...
- bzoj 3328 PYXFIB——单位根反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演主要就是有 \( [k|n] = \frac{1}{k}\sum\limit ...
- bzoj 3328 PYXFIB —— 单位根反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演,主要用到了 \( [k|n] = \frac{1}{k} \sum\lim ...
- BZOJ 3328: PYXFIB 单位根反演+矩阵乘法+二项式定理
如果写过 LJJ 学二项式那道题的话这道题就不难了. #include <bits/stdc++.h> #define ll long long #define setIO(s) freo ...
- 数论ex
数论ex 数学学得太差了补补知识点or复习 Miller-Rabin 和 Pollard Rho Miller-Rabin 前置知识: 费马小定理 \[ a^{p-1}\equiv 1\pmod p, ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【BZOJ3328】PYXFIB(单位根反演,矩阵快速幂)
[BZOJ3328]PYXFIB(单位根反演,矩阵快速幂) 题面 BZOJ 题解 首先要求的式子是:\(\displaystyle \sum_{i=0}^n [k|i]{n\choose i}f_i\ ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
随机推荐
- centos7 安全配置
CentOS是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事 ...
- LOJ 101 最大流(ISAP 模板)
开long long的最大流 #include<bits/stdc++.h> using namespace std; ;//点数的最大值 ;//边数的最大值 ; struct Edge ...
- hdu4864不是一般的贪心
题目表达的非常清楚,也不绕弯刚开始以为最大权匹配,仔细一想不对,这题的数据双循环建图都会爆,只能先贪心试一下,但一想贪心也要双循环啊,怎么搞? 想了好久没头绪,后来经学长提醒,可以把没用到的先记录下来 ...
- php三种方式操作mysql数据库
php可以通过三种方式操作数据库,分别用mysql扩展库,mysqli扩展库,和mysqli的预处理模式分别举案例加以说明 1.通过mysql方式操作数据库 工具类核心代码: <?php cla ...
- webdriver高级应用-js操作滚动条
1.滑动页面的滚动条到页面最下面 2.滑动页面的滚动条到页面的某个元素 3.滑动页面的滚动条向下移动某个数量的像素 #encoding=utf-8 from selenium import webdr ...
- day03_12 缩进介绍
python比较变态,必须缩进,而C可以不缩进,世界上只有python这门语言要求必须缩进 tab键是缩进,shift+tab往左移动 SyntaxError:invalid syntax 语法错误 ...
- bat 中的特殊符号输出问题
系统关键字(感叹号!)冲突 由于是自动化部署,因此需要使用到循环,这里就不可避免的用到了延迟变量(setlocal enabledelayedexpansion) 有关延迟变量的知识,大家可以通过这篇 ...
- Leetcode 421.数组中两数的最大异或值
数组中两数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ...
- 【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set
题目描述 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG ,如名字所见,到处充满了数学的谜题.现在你拥有n颗宝石,每颗宝石 ...
- manacher-模板-hd-3068
/* 题意:给一个字符串,求该串的最长回文串的长度: 算法:Manacher O(n)复杂度,求以每一个字符为中心的最长汇文串的长度: 这个算法把奇数和偶数的情况和在一起来考虑了: */ #inclu ...