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- ...
随机推荐
- python基础下的数据结构与算法之顺序表
一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表 ...
- 【转】frameset 框架集使用语法,常用语后台。
XHTML 框架概述 框架的使用可以让浏览器“分割”成多个页面显示内容,常用于如网站后台管理这些菜单项目固定,且对美观性和搜索引擎要求不高的地方. 框架的优缺点 框架方便制作栏目导航,操作各栏目时不需 ...
- DML和DQL 总结
一:MySql的存储引擎 问题的引入: 由于不同用户对数据的容量,访问速度,数据安全性有着不同的要求. 为了满足不同用户的需求,mysql数据库采用多种存储引擎来进行数据的存储! 1.1:查询mysq ...
- SHOI2019旅游记
题外话 为什么不更ZJOI day1的游记呢.... 因为考挂自闭了不想更.等day2考完再说咕咕咕 还是更个SHOI旅游记吧!反正不是自家省选,玩得真开心~~~ day0 SH好热好热啊,感觉到夏天 ...
- JAVA poi 帮助类
pom.xml 添加引用: <!--poi--> <dependency> <groupId>org.apache.poi</groupId> < ...
- 【BZOJ-3681】Arietta 网络流 + 线段树合并
3681: Arietta Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 182 Solved: 70[Submit][Status][Discuss ...
- Springboot_StringRedisTemplate配置
@Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { Str ...
- POP3_收取QQ邮箱邮件的问题
今天纠结了一天的时间,使用pop3协议收取qq邮箱中邮件时,因为一个特别坑爹的问题重新写n次,最后发现是因为qq邮箱设置了独立邮箱密码,必须的用独立邮箱密码登陆才行,/(ㄒoㄒ)/~~!!!! 但今天 ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(六)——调试
chrome强大的调试功能令许多开发者爱不释手,在使用cef的时候,我们也可以继承这强大的开发者工具. 集成调试: 我们可以使用如下函数直接使用集成在chrome里的开发者工具 _chrome.Sho ...
- LPC43XX TQFP144 IO Pinout