Discription

Input

第一行一个正整数,表示数据组数据 ,接下来T行
每行三个正整数N,K,P

Output

T行,每行输出一个整数,表示结果

Sample Input

1
1 2 3

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的更多相关文章

  1. 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- ...

  2. bzoj 3328: PYXFIB 数论

    3328: PYXFIB Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 130  Solved: 41[Submit][Status][Discuss ...

  3. bzoj 3328 PYXFIB——单位根反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演主要就是有 \( [k|n] = \frac{1}{k}\sum\limit ...

  4. bzoj 3328 PYXFIB —— 单位根反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演,主要用到了 \( [k|n] = \frac{1}{k} \sum\lim ...

  5. BZOJ 3328: PYXFIB 单位根反演+矩阵乘法+二项式定理

    如果写过 LJJ 学二项式那道题的话这道题就不难了. #include <bits/stdc++.h> #define ll long long #define setIO(s) freo ...

  6. 数论ex

    数论ex 数学学得太差了补补知识点or复习 Miller-Rabin 和 Pollard Rho Miller-Rabin 前置知识: 费马小定理 \[ a^{p-1}\equiv 1\pmod p, ...

  7. bzoj AC倒序

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

  8. 【BZOJ3328】PYXFIB(单位根反演,矩阵快速幂)

    [BZOJ3328]PYXFIB(单位根反演,矩阵快速幂) 题面 BZOJ 题解 首先要求的式子是:\(\displaystyle \sum_{i=0}^n [k|i]{n\choose i}f_i\ ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. python操作Excel模块openpyxl

    https://www.cnblogs.com/zeke-python-road/p/8986318.html # -*- coding: utf-8 -*-from openpyxl import ...

  2. MYSQL安装与库的基本操作

    mysql数据库 什么是数据库 # 用来存储数据的仓库 # 数据库可以在硬盘及内存中存储数据 数据库与文件存储数据区别 数据库本质也是通过文件来存储数据, 数据库的概念就是系统的管理存储数据的文件 数 ...

  3. HTTP认证之摘要认证——Digest(二)

    导航 HTTP认证之基本认证--Basic(一) HTTP认证之基本认证--Basic(二) HTTP认证之摘要认证--Digest(一) HTTP认证之摘要认证--Digest(二) 在HTTP认证 ...

  4. vmware esxi 6.0 开启嵌套虚拟化

    环境描述: 已通过vSphere Client创建一个名字为centos7的虚拟机,现在需要打开该虚拟机的嵌套虚拟化功能. 第一步: 开启ESXi Shell 开启vSphere的ssh远程登录服务或 ...

  5. hdu4864不是一般的贪心

    题目表达的非常清楚,也不绕弯刚开始以为最大权匹配,仔细一想不对,这题的数据双循环建图都会爆,只能先贪心试一下,但一想贪心也要双循环啊,怎么搞? 想了好久没头绪,后来经学长提醒,可以把没用到的先记录下来 ...

  6. goalng导出excel(csv格式)

    最近项目中有个小需求,需要将查询结果导出到excel.之间前java比较容易,使用POI很容易就能实现,查了下golang的文档,发现golang下边并没有导出excel的包,但是却有一个encodi ...

  7. 淘宝的TProfile分析

    TProfile是一个用来抓取性能数据的工具.大概是去年的时候对其分析了一下,并将它改造成了用于分析学习开源产品时的一个trace工具(不是很完善,自己用够用).现在将之前的笔记翻出来,记录一下. 1 ...

  8. webdriver高级应用- 操作日期控件

    1. 通过点击的方式操作日期控件 #encoding=utf-8 from selenium import webdriver import unittest, time, traceback fro ...

  9. linux随笔四

    1.ps -ef     : -e   显示系统上运行的所有进程,-f 显示一些有用的信息列 UID:负责启动进程的用户 PID:进程的ID PPID:父进程的PID(某个进程由另一个进程启动) C: ...

  10. 使用mysql监视器即命令行下的mysql

    命令行下登录mysql 首先必须在alias下有设置mysql, 我的mysql安装的位置在/usr/local/mysql 于是做了一个别名: alias mysql='/usr/local/mys ...