[bzoj3328]PYXFIB

356人阅读 评论(0) 收藏 举报
分类:

题目大意


nki=0CiknFik
F表示斐波那契数列

一点思路

这个形式很眼熟?
ni=1Cinxi=(1+x)n
那么同样,我们知道Fi=Ai[0][0]
A是一个2*2的矩阵,满足A[0][0]=A[0][1]=A[1][0]=1,而A[1][1]=0。
ni=1CinFi=(I+A)n[0][0]
I就是单位矩阵。

继续本题

然而k的倍数才能算??
注意到本题k是p-1的因数。
p是个质数,那么我们可以找到一个原根g。
找原根的方法是暴力枚举并检验,检验只需要检验p-1的每一个因数的次幂。
w=g(p1)/k
那么wk=1
有什么用呢?
注意以下等式成立
k1j=0wij=[i%k=0]k
为啥啊?
假如i%k=0,显然正确。
否则,式子等于等比数列求和,为1wik1wi
分子为0!
因此证明了这个结论。
那么这条等式怎么用呢?
1kni=0CinAi[0][0](k1j=0wij)就是答案了!
我们可以设F(x)=xn(xI+A)n=ni=0CinxiAi[0][0]
那么答案就是1k[k1j=0F(wj)]

#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
int o[2][2],one[2][2],a[2][2],b[2][2],c[2][2];
int ys[100000],sta[80];
int i,j,k,l,t,m,p,w,ans,ca,top;
ll n;
int qsm(int x,ll y){
    if (!y) return 1;
    int t=qsm(x,y/2);
    t=(ll)t*t%p;
    if (y%2) t=(ll)t*x%p;
    return t;
}
void work(int n){
    top=0;
    int i,t=floor(sqrt(n));
    fo(i,2,t)
        if (n%i==0){
            ys[++top]=i;
            if (n/i>i) ys[++top]=n/i;
        }
}
int getg(int n){
    work(n-1);
    int i,j;
    bool czy;
    fo(i,2,n){
        czy=1;
        fo(j,1,top)
            if (qsm(i,ys[j])==1){
                czy=0;
                break;
            }
        if (czy) break;
    }
    return i;
}
int getny(int x){
    return qsm(x,p-2);
}
int F(int x){
    a[0][0]=a[1][1]=x;
    a[0][1]=a[1][0]=0;
    int i,j,k;
    fo(i,0,1)
        fo(j,0,1)
            a[i][j]+=b[i][j];
    fo(i,0,1)
        fo(j,0,1)
            c[i][j]=one[i][j];
    top=0;
    ll t=n;
    while (t){
        sta[++top]=t%2;
        t/=2;
    }
    while (top){
        fo(i,0,1)
            fo(j,0,1)
                o[i][j]=0;
        fo(k,0,1)
            fo(i,0,1)
                fo(j,0,1)
                    o[i][j]=(o[i][j]+(ll)c[i][k]*c[k][j]%p)%p;
        fo(i,0,1)
            fo(j,0,1)
                c[i][j]=o[i][j];
        if (sta[top]){
            fo(i,0,1)
                fo(j,0,1)
                    o[i][j]=0;
            fo(k,0,1)
                fo(i,0,1)
                    fo(j,0,1)
                        o[i][j]=(o[i][j]+(ll)c[i][k]*a[k][j]%p)%p;
            fo(i,0,1)
                fo(j,0,1)
                    c[i][j]=o[i][j];
        }
        top--;
    }
    return (ll)getny(qsm(x,n))*c[0][0]%p;
}
int main(){
    one[0][0]=one[1][1]=1;
    b[0][0]=b[0][1]=b[1][0]=1;
    scanf("%d",&ca);
    while (ca--){
        scanf("%lld%d%d",&n,&k,&p);
        w=getg(p);
        w=qsm(w,(p-1)/k);
        ans=0;
        fo(i,0,k-1)
            (ans+=F(getny(qsm(w,i))))%=p;
        ans=(ll)ans*getny(k)%p;
        (ans+=p)%=p;
        printf("%d\n",ans);
    }
}
查看评论

【BZOJ 3328】PYXFIB

数论神题~(二项式定理+单位根+构造)
  • Regina8023
  • Regina8023
  • 2015年04月12日 09:06
  • 1309

bzoj 3328: PYXFIB 数论&矩阵乘法

AC代码如下: #include #include #include #define ll long long using namespace std; ll n; int m,mod,cnt,yz...
  • lych_cys
  • lych_cys
  • 2016年05月24日 12:59
  • 728

牛顿二项式定理

牛顿二项式定理 (Binomial theorem)flyfish1 排列组合 2 杨辉三角 二项式系数(binomial coefficient) 3牛顿二项式定理(a+b)(a+b) = a2...
  • flyfish1986
  • flyfish1986
  • 2017年01月20日 09:04
  • 313

[矩阵 二项式定理 单位根 构造 数学神题] BZOJ 3328 PYXFIB

题解:http://blog.csdn.net/regina8023/article/details/45007551 #include #include #include #include...
  • u014609452
  • u014609452
  • 2016年06月29日 16:51
  • 651

[BZOJ4762]最小集合/[JZOJ5151]幻梦终醒

题目大意 给定nn个数aia_i,你要从中选出一个非空子集,使得这个子集AND\mathrm{AND}和是00,并且这个子集的任意一个非空子集的AND\mathrm{AND}和都不是00。 1≤n...
  • a_crazy_czy
  • a_crazy_czy
  • 2017年06月21日 07:51
  • 284

bzoj 2734(状压DP+神题)

2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 993  Solved: 589 [Submit][S...
  • M_AXSSI
  • M_AXSSI
  • 2016年07月21日 17:34
  • 288

[BZOJ3328]PYXFIB/[JZOJ5150]却不悔付此华年

题目大意 给定n,K,Pn,K,P,求 ∑i=0⌊nk⌋(niK)fibiK \sum_{i=0}^{\left\lfloor\frac n k\right\rfloor}{n\choose iK...
  • a_crazy_czy
  • a_crazy_czy
  • 2017年06月20日 22:18
  • 200

BZOJ 3328: PYXFIB 二项式定理 原根 构造

题目大意:自己看去 题解:这真是一道神题,由于有大量的数学公式,不太好写(我懒,就附个链接吧题解戳我#include #include #include #include #include #inc...
  • LZJ209
  • LZJ209
  • 2017年06月23日 20:42
  • 155

BZOJ4174: tty的求助

一开始一直觉得是搞掉一个∑∑\sum然后用类欧做然后就不会了qaq 看了题解发现跟类欧完全没关系qaq 为了方便以下用[x]代表⌊x⌋为了方便以下用[x]代表⌊x⌋为了方便以下用[x]代表\l...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2018年02月26日 13:58
  • 90

NKOJ 2966 (BZOJ 3622)已经没什么好害怕的了 (DP+二项式反演)

P2966【2014湖北省队互测week2】已经没什么好害怕的了 问题描述 已经使Modoka有签订契约,和自己一起战斗的想法后,Mami忽然感到自己不再是孤单一人了呢。 ...
  • Mogician_Evian
  • Mogician_Evian
  • 2018年02月21日 22:22
  • 58
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 39万+
    积分: 1万+
    排名: 1456
    最新评论
    文章分类