BZOJ3328: PYXFIB
题目: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的更多相关文章
- BZOJ3328 PYXFIB 单位根反演
题意:求 \[ \sum_{i=0}^n[k|i]\binom{n}{i}Fib(i) \] 斐波那契数列有简单的矩阵上的通项公式\(Fib(n)=A^n_{1,1}\).代入得 \[ =\sum_{ ...
- bzoj3328: PYXFIB(单位根反演+矩阵快速幂)
题面 传送门 题解 我们设\(A=\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}\),那么\(A^n\)的左上角就是\(F\)的第\(n\)项 所 ...
- 【Luogu5293】[HNOI2019] 白兔之舞
题目链接 题目描述 略 Sol 考场上暴力 \(O(L)\) 50分真良心. 简单的推一下式子,对于一个 t 来说,答案就是: \[\sum_{i=0}^{L} [k|(i-t)] {L\choose ...
- 【BZOJ3328】PYXFIB 数论+矩阵乘法
[BZOJ3328]PYXFIB Description Input 第一行一个正整数,表示数据组数据 ,接下来T行每行三个正整数N,K,P Output T行,每行输出一个整数,表示结果 Sampl ...
- 【BZOJ3328】PYXFIB(单位根反演,矩阵快速幂)
[BZOJ3328]PYXFIB(单位根反演,矩阵快速幂) 题面 BZOJ 题解 首先要求的式子是:\(\displaystyle \sum_{i=0}^n [k|i]{n\choose i}f_i\ ...
- 【BZOJ3328】PYXFIB(数学)
什么都不会的数学蒻菜瑟瑟发抖--Orz橙子(和兔子) 题目: BZOJ3328 分析: 橙子给我安利的数学题--(然后我就看着他因为矩阵乘法多模了一次卡了一天常数qwq表示同情) 先考虑一个子问题:求 ...
- bzoj 3328: PYXFIB 数论
3328: PYXFIB Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 130 Solved: 41[Submit][Status][Discuss ...
- bzoj 3328 PYXFIB —— 单位根反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演,主要用到了 \( [k|n] = \frac{1}{k} \sum\lim ...
- 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- ...
随机推荐
- Django 2.1版本与Django 1.8.3的一些区别(转)
Django 2.1版本与Django 1.8.3的一些区别 我在刚开始学习的时候使用的Django版本是1.8.3的,后来在安装其它软件的时候,可能需要2.1的版本,自动帮我更新了Djang ...
- Mybatis通过注解方式实现批量插入数据库
原文地址:http://f0rb.iteye.com/blog/1207384 MyBatis中通过xml文件配置数据库批量操作的文章很多,比如这篇http://www.cnblogs.com/xcc ...
- Codeforces.1040E.Network Safety(思路 并查集)
题目链接 \(Description\) 有一张\(n\)个点\(m\)条边的无向图,每个点有点权.图是安全的当且仅当所有边的两个端点权值不同.保证初始时图是安全的. 现在有权值为\(x\)的病毒,若 ...
- pygame系列_font游戏字体_源码下载
在pygame游戏开发中,一个友好的UI中,漂亮的字体是少不了的 今天就给大伙带来有关pygame中字体的一些介绍说明 首先我们得判断一下我们的pygame中有没有font这个模块 if not py ...
- tomcat配置问题:访问http://localhost:8080/ 遇到 Access Error: 404
win7: 8080端口已经被其他应用使用,比如nixxxxxxxxxxxxx When I had an error Access Error: 404 -- Not Found I fixed i ...
- windows servier2008+virtualenv下部署Flask (IIS+wfastcgi)
由于业务只有一台windows server2008的服务器,一般的nginx+uwsgi的部署方式不行,以下记录部署过程,本文参考自:https://www.cnblogs.com/xiaolecn ...
- java并发基础(六)--- 活跃性、性能与可伸缩性
<java并发编程实战>的第9章主要介绍GUI编程,在实际开发中实在很少见到,所以这一章的笔记暂时先放一放,从第10章开始到第12章是第三部分,也就是活跃性.性能.与测试,这部分的知识偏理 ...
- LPC-LINK 2 Board IO
- Linux Shell脚本入门--wc命令
wc 统计文件里面有多少单词,多少行,多少字符. wc语法 [root@www ~]# wc [-lwm] 选项与参数: -l :仅列出行: -w :仅列出多少字(英文单字): -m :多少字符: 默 ...
- [Winform]关于cefsharp触屏设备长按文本内容,崩溃问题的修复
摘要 在之前遇到cefsharp,在触屏电脑上,长按文本内容,会崩溃的问题. 相关文章 当时遇到这样的问题,在cefsharp项目下提交了bug.已经修复,可以参考当时我提的bug,以及解决过程,可参 ...