首先我们知道对于f(x)来说,它是一个k次的多项式,那么f(x)的通项公式可以表示成一个k+1次的式子,且因为f(x)没有常数项,所以我们设这个式子为

    f(x)=Σ(a[i]*x^i) (1<=i<=k+1)

那么比较显然的是f(x+1)-f(x)=(x+1)^k,因为(x+1)^k=Σc(k,i)*x^i (0<=i<=k),所以我们可以将这个式子的左右展开,可以得到

    f(x+1)-f(x)=(x+1)^k    Σ(a[i]*(x+1)^i)-Σ(a[i]*x^i)=(x+1)^k   Σa[i](Σc(i,j)*x^j (0<=j<=i)-x^i) (1<=i<=k+1)=Σc(k,i)*x^i (0<=i<=k)

    Σa[i]Σc(i,j)*x^j (0<=j<=i-1) (1<=i<=k+1)=Σc(k,i)*x^i (0<=i<=k)

那么我们发现,式子的左右两边x的指数都是属于[0,k]的,那么对应项系数相等,可以得出k+1个式子,则对于任意一个系数j,我们有Σa[i]*c(i,j) (j+1<=i<=k+1)=c(k,j)。这样我们就有了k+1个式子,对于a数组的k+1个未知数,我们可以用高斯消元来解决这个问题。

  下面对于g(x),我们可以表示为

    g(x)=Σ(x-i+1)*i^k (1<=i<=x)

  我们可以进一步整理为

    g(x)=(x+1)Σi^k-Σi^(k+1) (1<=i<=x)

  那么我们发现,这个式子的前面就是(x+1)乘上f(x),后面就是一个类似f(x)的东西,只是系数变成了k+1,那么我们设这个表达式为w(x)且系数为b[i],那么类似于求f(x)的过程我们可以将b[i]求出来,那么g(x)=(x+1)*f(x)-w(x),那么对于相同指数的x我们可以直接合并,那么我们就可以得到g(x)的系数组。

  那么我们构造矩阵A[i](1,i^1,i^2....,i^(k+2)),那么对于(i+1)^j=Σc(j,l)*i^l (0<=l<=j),那么我们显然可以由上一层累加得到,系数为c(j,l)。

  那么我们构造矩阵B[j](1,i^1,i^2....,i^(k+2),Σg(s+j*d)) i=s+j*d,初始的时候最后一项可以由A[i]矩阵的s次幂转移乘上g的系数组得到,那么对于这个矩阵的转移矩阵,前半部分显然可以由为A[i]的转移矩阵的d次自乘得到,对于最后一项的转移则为上一次的Σ值累加上g(s+i*d)的值,我们可以由前面的i的若干次幂乘上g(x)的系数组转移得到。

  

/**************************************************************
    Problem: 3453
    User: BLADEVIL
    Language: C++
    Result: Accepted
    Time:11180 ms
    Memory:1444 kb
****************************************************************/
 
//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
#define maxk 150
#define P 1234567891
 
using namespace std;
 
struct mat{
    int n,m;
    int a[maxk][maxk];
    mat (int n,int m):n(n),m(m){memset(a,,sizeof a);};
};
 
int K,S,N,D;
int C[maxk][maxk];
int a[maxk][maxk],fac[][maxk];
 
 
mat operator *(const mat &a,const mat &b) {
    mat c(a.n,b.m);
    for (int i=;i<a.n;i++)
        for (int j=;j<b.m;j++)
            for (int k=;k<a.m;k++)
                c.a[i][j]=(c.a[i][j]+(LL)a.a[i][k]*b.a[k][j])%P;
    return c;
}
 
mat pwr(mat a,int x) {
    mat ans(a.n,a.n);
    for (int i=;i<a.n;i++) ans.a[i][i]=;
    while (x) {
        if (x&) ans=ans*a;
        a=a*a;
        x>>=;
    }
    return ans;
}
 
void pre(){
    C[][]=;
    for (int i=;i<maxk;i++) {
        C[i][]=C[i][i]=;
        for (int j=;j<i;j++)
            C[i][j]=((LL)C[i-][j-]+C[i-][j])%P;
    }
}
 
int pwr(int x,int y) {
    int ans=;
    while (y) {
        if (y&) ans=((LL)ans*x)%P;
        x=((LL)x*x)%P;
        y>>=;
    }
    return ans;
}
 
void gauss(int a[][maxk],int n) {
    for (int i=;i<n;i++) {
        int k=,t;
        for (k=i;(k<n)&&(!a[k][i]);k++);
        for (int j=;j<=n;j++) swap(a[i][j],a[k][j]);
        t=pwr(a[i][i],P-);
        for (int j=i;j<=n;j++) a[i][j]=((LL)a[i][j]*t)%P;
        for (int j=;j<n;j++) if (j!=i)
            for (k=n;k>=i;k--) a[j][k]=(a[j][k]+(LL)a[j][i]*(P-a[i][k]))%P;
    }
}
 
void solve() {
    memset(a,,sizeof a); memset(fac,,sizeof fac);
    for (int i=;i<=K;i++) {
        for (int j=i+;j<=K+;j++) a[i][j-]=C[j][i];
        a[i][K+]=C[K][i];
    }
    gauss(a,K+);
    for (int i=;i<=K;i++) fac[][i+]=a[i][K+]; K++;
    memset(a,,sizeof a);
    for (int i=;i<=K;i++) {
        for (int j=i+;j<=K+;j++) a[i][j-]=C[j][i];
        a[i][K+]=C[K][i];
    }
    gauss(a,K+);
    for (int i=;i<=K;i++) fac[][i+]=a[i][K+]; K--;
    for (int i=;i<=K+;i++) fac[][i]=fac[][i-];
    for (int i=;i<=K+;i++) fac[][i]=((LL)fac[][i]+fac[][i])%P;
    for (int i=;i<=K+;i++) fac[][i]=((LL)fac[][i]-fac[][i]+P)%P;
    mat DP(K+,K+);
    for (int i=;i<=K+;i++)
        for (int j=;j<=i;j++) DP.a[j][i]=C[i][j];
    DP=pwr(DP,D); DP.n++; DP.m++;
    for (int i=;i<=K+;i++)
        for (int j=;j<=K+;j++)
            DP.a[j][K+]=(DP.a[j][K+]+(LL)DP.a[j][i]*fac[][i])%P;
    DP.a[K+][K+]=;  
    mat A(,K+); A.a[][]=;
    for (int i=;i<=K+;i++) A.a[][i]=((LL)A.a[][i-]*S)%P;
    for (int i=;i<=K+;i++) A.a[][K+]=(A.a[][K+]+(LL)fac[][i]*A.a[][i])%P;
    A=A*pwr(DP,N);
    printf("%d\n",A.a[][K+]);
}
 
int main() {
    pre();
    int task;
    scanf("%d",&task);
    while (task--) {
        scanf("%d%d%d%d",&K,&S,&N,&D);
        solve();
    }
    return ;  
}

bzoj 3453 数论的更多相关文章

  1. BZOJ.3453.tyvj 1858 XLkxc(拉格朗日插值)

    BZOJ 题意即求\[\sum_{i=0}^n\sum_{j=1}^{a+id}\sum_{x=1}^jx^k\] 我们知道最后一个\(\sum\)是自然数幂和,设\(f(n)=\sum_{x=1}^ ...

  2. BZOJ 4815 数论

    今年的重庆省选? 具体就是,对于每次修改,A[p,q]这个位置,  设d=gcd(p,q) ,则 gcd为d的每一个格子都会被修改,且他们之间有个不变的联系 A[p,q]/p/q==A[k,t]/k/ ...

  3. BZOJ 2219 数论之神 (CRT推论+BSGS+原根指标)

    看了Po神的题解一下子就懂了A了! 不过Po神的代码出锅了-solve中"d-temp"并没有什么用QwQQwQQwQ-应该把模数除以p^temp次方才行. 来自BZOJ讨论板的h ...

  4. BZOJ 2219: 数论之神

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2219 N次剩余+CRT... 就是各种奇怪的分类讨论.. #include<cstrin ...

  5. bzoj 1406 数论

    首先问题的意思就是在找出n以内的所有x^2%n=1的数,那么我们可以得到(x+1)(x-1)=y*n,那么我们知道n|(x+1)(x-1),我们设n=a*b,那么我们对于任意的a,我们满足n%a==0 ...

  6. BZOJ 4173 数论

    思路: $(m%k+n%k>=k) *phi(k)$ $我们不妨设n=q_1k+r_1 m=q_2k+r$2 $n+m=(q_1+q_2)k+r1+r2$ ${\lfloor}\frac{n+m ...

  7. BZOJ 3453 - tyvj 1858 XLkxc(插值+推式子)

    题面传送门 首先根据我们刚学插值时学的理论知识,\(f(i)\) 是关于 \(i\) 的 \(k+1\) 次多项式.而 \(g(x)\) 是 \(f(x)\) 的前缀和,根据有限微积分那一套理论,\( ...

  8. Mobius 反演

    上次看莫比乌斯繁衍反演是一个月前,讲道理没怎么看懂.. 然后出去跪了二十天, 然后今天又开始看发现其实并不难理解   开个这个仅记录一下写过的题. HAOI 2011 B   这应该是莫比乌斯反演的模 ...

  9. Note -「Lagrange 插值」学习笔记

    目录 问题引入 思考 Lagrange 插值法 插值过程 代码实现 实际应用 「洛谷 P4781」「模板」拉格朗日插值 「洛谷 P4463」calc 题意简述 数据规模 Solution Step 1 ...

随机推荐

  1. 微信小程序项目笔记以及openId体验版获取问题

    公司一直说要搞小程序,说了几个月,最近才算落地,一个很小的项目,就结果来讲,勉强让自己窥得小程序门径. 下面总结一下,为了弄好小程序,所学到的知识,以及项目中遇到的问题以及解决的办法.纯属个人见解. ...

  2. centos7编译安装redis遇坑

    编译redis时:make cc Command not found 原因分析:没有安装gcc,执行: yum install gcc 编译redis时:error: jemalloc/jemallo ...

  3. Java问题排查工具单

    前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常 ...

  4. Ajax在jQuery中的应用($.ajax()方法)

    Ajax() 方法 $.ajax() 中的参数及使用方法 在jQuery中,$.ajax() 是最底层的方法,也是功能最强的方法.$.get().$.post().$.getScript().getJ ...

  5. 【其他】UTF-8带签名与不带签名

    在 Visual Web Developer 另存为文件时,有编码选项,其中有: Unicode (UTF-8 with signature) - Codepage 65001 Unicode (UT ...

  6. springBoot按条件装配:Condition

    编码格式转换器接口 package com.boot.condition.bootconditionconfig.converter; /** * 编码格式转换器接口 */ public interf ...

  7. Python面向对象—类属性和实例属性

    属性:就是属于一个对象的数据或函数元素 类有类方法.实例方法.静态方法.类数据属性(类变量)和实例数据属性(实例变量). 类属性:包括类方法和类变量,可以通过类或实例来访问,只能通过类来修改. 实例属 ...

  8. 【刷题】UOJ #34 多项式乘法

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数. 第二行 \(n+1\) 个整数,表示第一个多项式的 \( ...

  9. [NOIP2015 TG D2T3]运输计划

    题目大意: 给你一棵n个节点的树,有边权,有多个任务,每个要求从ui号节点到 vi号节点去.m 个计划, 这 m 个计划会同时开始.当这 m 个任务都完成时,工作完成. 现在可以把任意一个边的边权变为 ...

  10. YY的GCD 莫比乌斯反演

    ---题面--- 题解: $ans = \sum_{x = 1}^{n}\sum_{y = 1}^{m}\sum_{i = 1}^{k}[gcd(x, y) == p_{i}]$其中k为质数个数 $$ ...