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. Python9-hashilib模块-day28(大年初三)

    __getitem__\__setitem__\__delitem__ class Foo: def __init__(self,name,age,sex): self.name = name sel ...

  2. Java-basic-6-方法

    命令行参数的使用 public class test { public static void main(String args[]) { for(int i = 0; i < args.len ...

  3. jmeter中基于oracle的JDBC Request的使用

    前提条件: 1.有数据库:2.数据库中有表,例如testuser(userid,username,usepwd): 设置如下: 参考自:http://www.linuxidc.com/Linux/20 ...

  4. 2015四川省赛 D Vertex Cover 搜索

    题意: 给出一个\(n\)个点\(m\)条边的无向图,现在要给若干个点染色,使得每条边都至少邻接一个被染色的顶点.问至少要给多少各点染色才能满足条件. 分析: 注意到题目中有一个很特殊的条件: 对于图 ...

  5. loj2032 「SDOI2016」游戏

    做了 [JSOI2008]Blue Mary开公司 以后发现这 tm 不就是个傻逼树剖+李超线段树吗,做了以后发现我才是傻逼--树剖竟然写错了--这题是我目前写过最长的代码了qwq #include ...

  6. 浅谈我所见的CSS命名风格

    在两年工作中,总结一下我所见的css命名风格. 1.单一class命名 .header { width: 500px; } .item { text-indent: 20%; } 优点:简单,渲染效率 ...

  7. 【LeetCode】Binary Tree Inorder Traversal(二叉树的中序遍历)

    这道题是LeetCode里的第94道题. 题目要求: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单 ...

  8. java EE技术体系——CLF平台API开发注意事项(4)——API生命周期治理简单说明

    文档说明 截止日期:20170905,作者:何红霞,联系方式:QQ1028335395.邮箱:hehongxia626@163.com 综述 有幸加入到javaEE技术体系的研究与开发,也得益于大家的 ...

  9. poj 2195 最小费用最大流模板

    /*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...

  10. Welcome-to-Swift-12附属脚本(Subscripts)

    附属脚本 可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问对象.集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法.举例来说 ...