题目: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. P3402 最长公共子序列

    P3402 最长公共子序列经典问题LCS-->LIS把第一数列转化成1~n,然后将第二个数列映射成1~n中的一些数,然后求第二个数列的LIS即可,然后用Bit求LIS,O(nlogN) //数据 ...

  2. 为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录

    为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录???原因很简单: SELECT * FROM dbo.TableA AS a WHERE a.id NOT IN ( ...

  3. ssh端口转发(之kettle ssh方式连接数据库)

    ssh参数解释 格式 ssh  [user@]host [command] 选项: -1:强制使用ssh协议版本1: -2:强制使用ssh协议版本2: -4:强制使用IPv4地址: -6:强制使用IP ...

  4. Web大前端面试题-Day4

    1. 如何实现瀑布流? 瀑布流布局的原理:1) 瀑布流布局要求要进行布置的元素等宽,   然后计算元素的宽度,   与浏览器宽度之比,得到需要布置的列数;2) 创建一个数组,长度为列数,   里面的值 ...

  5. 20172308《Java软件结构与数据结构》第三周学习总结

    教材学习内容总结 第 5 章 队列 队列: 一种线性集合,其元素从一端加入,从另一端删除 元素处理:FIFO 与栈的比较 异:(1) 栈的处理过程只在栈的某一端进行:队列的处理过程在队列的两端进行.( ...

  6. SetProcessWorkingSetSize 降低程序运行内存

    在项目中对程序性能优化时,发现用SetProcessWorkingSetSize() 方法使内存降低了很多,于是查阅了相关的资料如下. 一 SetProcessWorkingSetSize 的工作原理 ...

  7. DOM操作——JavaScript怎样添加、移除、移动、复制、创建和查找节点

    (1). 创建新节点 createDocumentFragment() // 创建一个DOM片段 createElement() // 创建一个具体的元素 createTextNode() // 创建 ...

  8. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem C. Cargo Transportation 暴力

    Problem C. Cargo Transportation 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed ...

  9. 使用 IntraWeb (6) - 页面模板: TIWLayoutMgrHTML、TIWTemplateProcessorHTML

    IW 通过 TIWLayoutMgrHTML 和 TIWTemplateProcessorHTML 使用 HTML 模板. 所谓模板就是一个特殊 HTML 文件, 特殊之处是: 它里面会类似 {% I ...

  10. Cocos2d-x 3.0游戏开发之虚拟机IOS环境:匹配才是好,莫要随便升级软件

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/34110449 做为一个买不起MAC的Coder,仅 ...