警示后人:关于静态(static)数组清空
查看原帖
警示后人:关于静态(static)数组清空
235125
Starrykiller暁美 ほむら楼主2023/7/9 08:50

原本我的 get_ln 是这么写的:

inline void get_ln(int n, int *f, int *g) { // 求f的ln,结果存在g中
    static int df[MAXN*8], invf[MAXN*8], dg[MAXN*8];
    int N=1<<(__lg(n+n+1+1)+1);
    deriv(n,f,df);
    get_inv(n,f,invf);
    // F' * F^(-1)
    fntt(df,N); fntt(invf,N);
    for (reg int i=0; i<N; ++i)
        dg[i]=modu(df[i]*invf[i]);
    fntt(dg,N,-1);
    inte(n,dg,g);
}

在多项式 ln⁡\ln 的模板中,由于只需要求一次 ln⁡\ln ,这么写并不会有什么影响。但是如果到了求 exp⁡\exp 的题目,需要多次求 ln⁡\ln ,先前的数字就会对结果有影响。(连样例都过不了)

被 static 关键字修饰的局部变量有以下特点:

(1)该变量在全局数据区分配内存;

(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;

(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为 0;

(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

inline void get_ln(int n, int *f, int *g) { // 求f的ln,结果存在g中
    static int df[MAXN*8], invf[MAXN*8], dg[MAXN*8];
    int N=1<<(__lg(n+n+1+1)+1);
    for (reg int i=0; i<N; ++i) df[i]=invf[i]=dg[i]=0; // 记得清空
    deriv(n,f,df);
    get_inv(n,f,invf);
    // F' * F^(-1)
    fntt(df,N); fntt(invf,N);
    for (reg int i=0; i<N; ++i)
        dg[i]=modu(df[i]*invf[i]);
    fntt(dg,N,-1);
    inte(n,dg,g);
}
2023/7/9 08:50
加载中...