题目: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. 在谈PHP中的 抽象类(abstract class)和 接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  2. python基础下的数据结构与算法之顺序表

    一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表 ...

  3. 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 前一篇文章 ...

  4. SpringMVC(十) RequestMapping RequestHeader注解

    在控制器方法中,通过类似 RequestHeader(value="Accept-Lanaguage") String lan 可以获取请求头信息. 控制器方法: package ...

  5. [python]接口签名

    一个主机中的数据要通过外网发送数据给另外一个主机,为了保证接口安全,需要对接口进行签名,由于重放攻击貌似对这种接口无效,所以没有加入时间戳 直接放代码: #!/usr/bin/env python # ...

  6. Django-Filter源码解析一

    Django Filter源码解析 最近在看Django-FIlter项目的源码,学习一下别人的开发思想: 整体介绍 首先,我从其中一个测试用例作为入口,开始了debug之路,一点一点的断点,分析它的 ...

  7. 【Codechef FRBSUM】【FJOI2016】【BZOJ4299】【BZOJ 4408】 可持久化线段树

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 475  Solved: 287[Submit][Status ...

  8. 接口开发-基于SpringBoot创建基础框架

    说到接口开发,能想到的开发语言有很多种,像什么Java啊..NET啊.PHP啊.NodeJS啊,太多可以用.为什么选择Java,究其原因,最后只有一个解释,那就是“学Java的人多,人员招聘范围大,有 ...

  9. 跟着老王学Python

    亲爱的朋友:     欢迎你!很高兴能在这里见到你,你能来到这里说明你真的很喜欢python,很想把python给学好!我觉的你很幸运,开始我学python的时候比较少资料,学起来也比较头疼,现在随着 ...

  10. Tesseract OCR简单实用介绍

    做字符识别,不能不了解google的Tesseract-OCR,但是如何在自己的工程中使用其API倒是语焉不详,官网上倒是很详尽地也很啰嗦地介绍如何重新编译生成适合自己平台的lib和dll,经过近些天 ...