题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3328

题解:关键在于只处理i%k的项,那么我们就需要用一个式子来表达这个东西。

p%k==1.会让我们想到NTT的w=power(g,(p-1)/k)。而w的性质就是w^i=1%p当且仅当i%k=0。g是p的一个原根。

所以sigma(w^i)(0<=i<k)=0

然后我们构造一个A[x]=x^(-n)*(I*x+T)^n  其中I是单位矩阵,T是fib矩阵。

然后做A[W^0],A[W^-1]……A[W^-K+1]求和左上角就是K*ans。

因为sigma(w^ij)(0<=i<k)=k[j%k==0]

构造技巧实在太科幻,不愧是业界毒瘤出的题。

代码:

 #include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 10000+5
#define maxm 10000000
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
#define lch t[k].l,l,mid
#define rch t[k].r,mid+1,r
using namespace std;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
struct matrix
{
int d[][];
};
matrix A,I,T,ans;
ll n;
int p,k,g,w,pr[maxn];
inline void print(matrix a)
{
for1(i,)for1(j,)printf("%d%c",a.d[i][j],j==?'\n':' ');
}
matrix operator *(matrix a,matrix b)
{
matrix c=A;
for1(i,)for1(j,)for1(k,)(c.d[i][j]+=(ll)a.d[i][k]*b.d[k][j]%p)%p;
return c;
}
matrix operator +(matrix a,matrix b)
{
matrix c;
for1(i,)for1(j,)c.d[i][j]=(a.d[i][j]+b.d[i][j])%p;
return c;
}
matrix operator *(matrix a,int b)
{
matrix c;
for1(i,)for1(j,)c.d[i][j]=(ll)a.d[i][j]*b%p;
return c;
}
inline int power(int x,int y)
{
int t=;
for(;y;y>>=,x=(ll)x*x%p)
if(y&)t=(ll)t*x%p;
return t;
}
inline matrix power(matrix x,ll y)
{
matrix t=I;
for(;y;y>>=,x=x*x)
if(y&)t=t*x;
return t;
}
inline int gen()
{
int t=p-,x=sqrt(t);pr[]=;
for2(i,,x)if(t%i==)
{
pr[++pr[]]=i;
while(t%i==)t/=i;
}
if(t>)pr[++pr[]]=t;
for2(i,,inf)
{
bool flag=;
for1(j,pr[])if(power(i,(p-)/pr[j])==){flag=;break;}
if(!flag)return i;
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
I.d[][]=I.d[][]=;
T.d[][]=T.d[][]=T.d[][]=;
int cs=read();
while(cs--)
{
n=read();k=read();p=read();g=gen();w=power(g,(p-)/k);ans=A;
for3(i,,-k+)
{
int x=power(w,k+i);
ans=ans+power(I*x+T,n)*power(x,((-n)%k+k)%k);
}
cout<<(ll)ans.d[][]*power(k,p-)%p<<endl;
}
return ;
}

BZOJ3328: PYXFIB的更多相关文章

  1. BZOJ3328 PYXFIB 单位根反演

    题意:求 \[ \sum_{i=0}^n[k|i]\binom{n}{i}Fib(i) \] 斐波那契数列有简单的矩阵上的通项公式\(Fib(n)=A^n_{1,1}\).代入得 \[ =\sum_{ ...

  2. bzoj3328: PYXFIB(单位根反演+矩阵快速幂)

    题面 传送门 题解 我们设\(A=\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}\),那么\(A^n\)的左上角就是\(F\)的第\(n\)项 所 ...

  3. 【Luogu5293】[HNOI2019] 白兔之舞

    题目链接 题目描述 略 Sol 考场上暴力 \(O(L)\) 50分真良心. 简单的推一下式子,对于一个 t 来说,答案就是: \[\sum_{i=0}^{L} [k|(i-t)] {L\choose ...

  4. 【BZOJ3328】PYXFIB 数论+矩阵乘法

    [BZOJ3328]PYXFIB Description Input 第一行一个正整数,表示数据组数据 ,接下来T行每行三个正整数N,K,P Output T行,每行输出一个整数,表示结果 Sampl ...

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

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

  6. 【BZOJ3328】PYXFIB(数学)

    什么都不会的数学蒻菜瑟瑟发抖--Orz橙子(和兔子) 题目: BZOJ3328 分析: 橙子给我安利的数学题--(然后我就看着他因为矩阵乘法多模了一次卡了一天常数qwq表示同情) 先考虑一个子问题:求 ...

  7. bzoj 3328: PYXFIB 数论

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

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

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

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

随机推荐

  1. Java之路(四)数组初始化

    本文主要讲数组的初始化方法.可变参数列表以及可变参数列表对函数重载的影响. 1.数组初始化 定义数组的方式: int[] arr1; 或  int arr1[]; 数组初始化 通过上边的定义,我们只是 ...

  2. grid网格系统布局

    grid布局: 基于网格的2维布局方法1:display: grid | inline-grid | subgrid作用:启用网格grid容器 grid:定义一个块级的网格容器 inline-grid ...

  3. Atom-同步设置

    Atom-同步设置 参考博客 CNBLOG First 首先呢,如果我们想要通过Atom的设置和插件的话,我们需要这个一个Atom插件. PS: 因为Gist被墙的原因,所以需要***才行,我挂了ss ...

  4. Python学习——Python 容器(列表,元组,字典,集合)

    列表: 列表非常适合利用顺序和位置定位某一元素,尤其是当元素的顺序或内容经常发生改变时.与字符串不同,列表是可变的. 你可以直接对原始列表进行修改:添加新元素.删除或覆盖已有元素.在列表中,具有相同值 ...

  5. 【BZOJ-2329&2209】括号修复&括号序列 Splay

    2329: [HNOI2011]括号修复 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1007  Solved: 476[Submit][Statu ...

  6. JVM启动流程

    JVM启动流程 (1)在java中jvm是通过java或javaw命令启动的,后面跟加载的类名. (2)jvm在启动的时候先根据[当前路径和系统版本寻找jvm的配置文件jvm.cfg]装载配置. (3 ...

  7. 【原】用IDEA远程Debug Tomcat服务

    [环境参数] Web容器:Tomcat 8.0 IDE:IDEA 2018.1.5 [具体步骤] 1.配置Tomcat容器参数 编辑$CATALINA_HOME/bin/catalina.sh脚本,加 ...

  8. centos上安装elasticsearch 5.5.1 遇到的各种坑

    mac玩得好好滴,一次性启动成功,结果在centos上安装时,遇坑无数,记录一下: 一.只能localhost访问的问题修改 conf\elasticsearch.yml network.host: ...

  9. how convert large HEX string to binary array ?

    how convert large HEX string to binary I have a string with 14 characters . This is a hex represanta ...

  10. 【Go命令教程】4. go get

    hc@ubt:~$ go get github.com/hyper-carrot/go_lib/logging 命令 go get 可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并 ...