关闭

[51nos1971]驴蛋蛋与老孙与微分式

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

题目描述

http://www.51nod.com/contest/problem.html#!problemId=1971

oeis

这是一道oeis题,把答案打表,差分丢oeis,可以得到一个东西。
接下来用FFT预处理伯努利数,用公式做。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int N = 800500, mo = 1e9+7, P = 1e9+7;
const double PI = acos(-1.0);
inline ll read(){
    char c=getchar(); ll x=0,f=1;
    while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
    return x*f;
}

int xx,l,r,ca;
int zjy[N];
int qsm(int x,int y){
    if (!y) return 1;
    int t=qsm(x,y/2);
    t=(ll)t*t%mo;
    if (y%2) t=(ll)t*x%mo;
    return t;
}
struct meow{
    double x, y;
    meow(double a=0, double b=0):x(a), y(b){}
};
meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}
meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}
meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}
meow conj(meow a) {return meow(a.x, -a.y);}
typedef meow cd;

namespace fft {
    int rev[N], maxlen = 1<<19;
    cd omega[N], omegaInv[N];
    void init() {
        for(int i=0; i<maxlen; i++) {
            omega[i] = cd(cos(2*PI/maxlen*i), sin(2*PI/maxlen*i));
            omegaInv[i] = conj(omega[i]);
        }
    }
    void dft(cd *a, int n, int flag) {
        cd *w = flag==1 ? omega : omegaInv;
        for(int i=0; i<n; i++) if(i < rev[i]) swap(a[i], a[rev[i]]);
        for(int l=2; l<=n; l<<=1) {
            int m = l>>1;
            for(cd *p = a; p != a+n; p += l) 
                for(int k=0; k<m; k++) {
                    cd t = w[maxlen/l*k] * p[k+m];
                    p[k+m] = p[k] - t;
                    p[k] = p[k] + t;
                }
        }
        if(flag == -1) for(int i=0; i<n; i++) a[i].x /= n;
    }

    cd a[N], b[N], c[N], d[N]; int z[N];
    void inverse(int *x, int *y, int l) {
        if(l == 1) {y[0] = 1; return;}
        inverse(x, y, (l+1)>>1);
        int n = 1, k = 0; while(n < l<<1) n<<=1, k++;
        for(int i=0; i<n; i++) rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));

        for(int i=0; i<l; i++) a[i] = cd(y[i]>>15), b[i] = cd(y[i]&32767);
        for(int i=l; i<n; i++) a[i] = b[i] = cd();
        dft(a, n, 1); dft(b, n, 1);
        for(int i=0; i<n; i++) {
            cd _a = a[i], _b = b[i];
            a[i] = _a * _a;
            b[i] = _a * _b + _a * _b;
            c[i] = _b * _b;
        }
        dft(a, n, -1); dft(b, n, -1); dft(c, n, -1);
        for(int i=0; i<l; i++)
            z[i] = ( (ll(a[i].x + 0.5) %mo << 30) %mo + (ll(b[i].x + 0.5) %mo << 15) %mo + ll(c[i].x + 0.5) %mo) %mo;

        for(int i=0; i<l; i++) 
            a[i] = cd(x[i]>>15), b[i] = cd(x[i]&32767), c[i] = cd(z[i]>>15), d[i] = cd(z[i]&32767); 
        for(int i=l; i<n; i++) a[i] = b[i] = c[i] = d[i] = cd();

        dft(a, n, 1); dft(b, n, 1); dft(c, n, 1); dft(d, n, 1);

        for(int i=0; i<n; i++) {
            cd _a = a[i], _b = b[i], _c = c[i], _d = d[i];
            a[i] = _a * _c;
            b[i] = _a * _d + _b * _c;
            c[i] = _b * _d;
        }
        dft(a, n, -1); dft(b, n, -1); dft(c, n, -1);
        for(int i=0; i<l; i++) {
            ll t = ( (ll(a[i].x + 0.5) %mo << 30) %mo + (ll(b[i].x + 0.5) %mo << 15) %mo + ll(c[i].x + 0.5) %mo) %mo;
            y[i] = (y[i] * 2 %mo - t +mo) %mo;
        }
    }
}

int n, m, a[N], b[N];
ll inv[N], fac[N], facInv[N], mi[N];
inline ll C(int n, int m) {return fac[n] * facInv[m] %mo * facInv[n-m] %mo;}
inline ll cal(int n, int m) {
    ll ans = 0;
    mi[0] = 1; for(int i=1; i<=m+1; i++) mi[i] = mi[i-1] * n %mo;
    for(int i=0; i<=m; i++) if(b[i]) (ans += C(m+1, i) * b[i] %mo * mi[m+1-i] %mo) %= mo;
    ans = (ans * inv[m+1]) %mo;
    return ans;
}

int main() {
//  freopen("in", "r", stdin);
    n = 200001;
    inv[1] = fac[0] = facInv[0] = 1;
    for(int i=1; i<=n; i++) {
        if(i != 1) inv[i] = (P - P/i) * inv[P%i] %P;
        fac[i] = fac[i-1] * i %P;
        facInv[i] = facInv[i-1] * inv[i] %P;
    }
    fft::init();
    for(int i=0; i<n; i++) a[i] = facInv[i+1];
    fft::inverse(a, b, n);
    for(int i=0; i<n; i++) b[i] = b[i] * fac[i] %mo;
    fo(xx,0,n-1){
        if (xx%2==1||xx==0) r=b[2*xx];else r=mo-b[2*xx];
        l=(ll)qsm(2,2*xx)*(qsm(2,2*xx)-1)%mo*r%mo*qsm(2*xx,mo-2)%mo;
        (l+=mo)%=mo;
        zjy[xx]=l;
        if (xx) (zjy[xx]+=zjy[xx-1])%=mo;
    }
    scanf("%d",&ca);
    while (ca--){
        scanf("%d",&n);
        /*if (n%2==1||n==0) r=b[2*n];else r=mo-b[2*n];
        l=(ll)qsm(2,2*n)*(qsm(2,2*n)-1)%mo*r%mo*qsm(2*n,mo-2)%mo;
        (l+=mo)%=mo;*/
        printf("%d\n",zjy[(n+1)/2]);
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[多项式求逆] 51Nod TalkingData数据科学精英夏令营挑战赛 F 驴蛋蛋与老孙与微分式

题解里给出了一种解偏微分方程得出生成函数的方法 最后应该是 H(z,x)=sinz+xcoszcosz−xsinzH(z,x)={\sin z+x \cos z \over \cos z−x\si...
  • u014609452
  • u014609452
  • 2017-06-18 14:09
  • 374

03-白龙马与拉磨驴的人生

白龙马与拉磨驴的人生   话说唐僧师徒西天取经时所骑的的白龙马,本来是长安城中一家磨房中一匹普通的白马,本身也没有什么与众马不同之处,只不过是一生下来,就在磨房中干活,身体强壮,吃苦耐劳,而且...
  • u010653050
  • u010653050
  • 2016-02-19 09:58
  • 1018

蓝桥杯_C语言_本科B——奇怪的分式

标题:奇怪的分式上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)老师刚想批评他,转念...
  • coderALEX
  • coderALEX
  • 2016-11-17 21:12
  • 798

2017年最新仿微信红包扫雷多雷禁抢雷接龙牛牛源码和安装教程V10

2017年最新仿微信红包扫雷多雷禁抢雷接龙牛牛源码和安装教程V10 本站为唯一发布,其他任何论坛或者地址均为假冒诈骗,请分清谨慎。 本站源码为原生源码的升级和完善,不是网上那种只是修改下ui或者没...
  • study2018
  • study2018
  • 2017-11-16 21:56
  • 547

转载:天涯——散文天下——《小驴坑爹记》——作者:南方孤驴

《小驴坑爹记》   俗话说:一物自有一物治,另一个物理学理论是:三角形稳定性最好。   这样的理论,套用到驴家,就形成这样的生态格局:驴怕驴太,驴太怕小驴,小驴怕驴。所以驴家多年来一直...
  • jhts95559
  • jhts95559
  • 2015-09-10 16:14
  • 436

bzoj 2437 [Noi2011]兔兔与蛋蛋 [二分图匹配]

描述这些天,兔兔和蛋蛋喜欢上了一种新的棋类游戏。 这个游戏是在一个 n 行 m 列的棋盘上进行的。游戏开始之前,棋盘上有一 个格子是空的,其它的格子中都放置了一枚棋子,棋子或者是黑色,或者是白色。 每...
  • u011265346
  • u011265346
  • 2015-06-03 11:31
  • 1259

奇怪的分式Java

问题:上小学的时候,小明经常自己发明新算法。一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) ...
  • qw963895582
  • qw963895582
  • 2016-03-04 10:20
  • 356

Java算法-奇怪的分式

题目:上小学的时候,小明经常自己发明新算法。一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 老师刚想批评他,转念一想,这个答案凑巧也...
  • u010870518
  • u010870518
  • 2015-03-18 21:23
  • 1386

第五届蓝桥杯【省赛试题6】奇怪的分式

题目描述: 上小学的时候,小明经常自己发明新算法。一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批...
  • qq_34594236
  • qq_34594236
  • 2017-03-07 20:40
  • 434

矩阵求导公式,及MathJax公式编辑

最近学到线性回归中要用到向量,矩阵求导,所以就搜集了下资料,总结如下: 矩阵求导有两种布局: 分子布局(numerator layout) 分母布局(denominator layout)下面用...
  • lilong117194
  • lilong117194
  • 2017-08-19 23:46
  • 388
    个人资料
    • 访问:327193次
    • 积分:11634
    • 等级:
    • 排名:第1512名
    • 原创:814篇
    • 转载:4篇
    • 译文:0篇
    • 评论:201条
    最新评论
    文章分类