CodeChef Weird Product

技术CodeChef Weird Product CodeChef Weird ProductCodeChef Weird Product
? 设 \(p_k=\sum\limits_{i=1}^kA

奇怪的产品

CodeChef Weird Product

?设\(p_k=\sum\limits_{i=1}^ka_ix^i\),且\(p_0=0\)。则\(\对于所有1 \ le I \ le j \len,\,w(i,j)=\dfrac{p_j-p_{i-1}}{x^i}\)。于是有

\[\begin{align*}p=\prod_{i=1}^n\prod_{j=i}^nw(i,j)^2\\=\left(\prod_{i=0}^n\prod_{j=i 1}^n\dfrac{p_j-p_i}{x^{i 1}}\right)^2\\=\dfrac{\left(\prod\limits_{i=0}^n\prod\limits_{j=i 1}^n(p_j-p_i)\right)^2}{x^{2\times \sum\limits_{i=1}^ni\cdot(n-i)}}\end{align*}

\]上式中的分母很好计算,现在主要考虑如何计算分子。

?注意到\((p_j-p_i)^2=-(p_j-p_i)\cdot(p_i-p_j)\),则可以考虑将分子变形为

\[\begin{align*}\operatorname{numerator}(p)=(-1)^{\frac{n\cdot(n 1)}{2}}\prod_{i=0}^{n}\prod_{j\neq I }(p _ j-p _ I)\ end { align * }

\]设\(f(I)=\ prod \ limits _ { j \ neq I }(p _ I-p _ j)\),那么有

\[\begin{align*}\operatorname{numerator}(p)=(-1)^{\frac{n\cdot(n 1)}{2}}\prod_{i=0}^{n}(-1)^{n}f(i)\end{align*}

\]可以考虑直接将\(f(0\ldots N-1)\)求出来。

?注意到\(f(i)\)的结构非常相似,因此我们的想法是找到一个多项式\(F(x)\)满足\(f(i)=F(p_i)\)。如果找到了这样的\(F(x)\),那么就可以对\(F(x)\)做一遍多项式多点求值来求出\(f(i)\)。

?于是我们可以考虑类似于拉格朗日插值定理那样的方式去构造:设\(f(x)=\sum\limits_{i=0}^n\prod\limits_{j\neq I }(x-p _ j)\),则有等式\(F(p _ I)=\ prod \ limits _ { j \ neq I }(p _ I-p _ j)=F(I)\)。那么又该如何将\(F(x)\)求出来呢

?让我们先考虑另一个多项式\(g(x)=\prod\limits_{i=0}^n(x-p_i)\)。那么就有\(f(x)=\sum\limits_{i=0}^n\dfrac{g(x)}{x-p_i}=g'(x)\)。于是只要将\(G(x)\)求出来再对其求导就行了。

?至于如何求\(G(x)\)可以用启发式合并NTT的方法,时间复杂度为\(\数学cal o(n \ log ^2n)\);对\(F(x)\)进行多项式多点求值的时间复杂度也是\(\数学O(N\log ^2N)\)的。总时间复杂度就是线对平方。

参考代码

#包含位/stdc .h

使用命名空间标准;

/**

此处省略多项式全家桶的模板

**/

静态常量expr值_ t mod=poly : p;

内联value_t add(value_t x,value _ t y){ return(x=y)=mod x-mod : x;}

内联value_t mul(value_t x,value _ t y){ return(int 64 _ t)x * y % mod;}

内联value_t add_eq(value_t x,value_t y) { return x=add(x,y);}

inline value_t mul_eq(value_t x,value_t y) { return x=mul(x,y);}

内联值_t qpow(值_t x,int 64 _ t y){ 0

value _ t r=1;

for(;y;y=1,mul_eq(x,x))

(y 1) (mul_eq(r,x));

返回r;

} //qpow

static constexpr int Maxn=1e5 5

int N;

value_t X,iX,Xp,A[Maxn];

value_t p[Maxn],P;

poly getG(int l,int r){ 0

if (l==r)返回保利{!p[l] 0 : mod - p[l],1 };

int mid=(l r)1;

返回getG(l,mid) * getG(mid 1,r);

} //getG

int main(void){ 0

内部测试;

scanf("% d ",测试);

而(测试-){ 0

scanf('%d%u ',N,X);

p[0]=0;XP=1;

iX=qpow(X,mod-2);

for(int I=1;I=N;I){ 0

scanf('%u ',A[I]);

p[i]=add(p[i - 1],mul(A[i],mul_eq(Xp,X)));

}

自动f=getG(0,N).导数()。求值(向量(p,p ^ n1);

bool neg=((int 64 _ t)n *(n ^ 1)/2)% 2==1);

value _ t num=1;

for(int I=0;I=N;i) mul_eq(num,f[I]);

int 64 _ t exp=(int 64 _ t)n *(n ^ 1)*(n ^ 2)/3;

exp %=(mod-1);

value_t dinom=qpow(iX,Exp);

P=mul_eq(num,dinom);

printf('%u\n ',neg(!P 0 : mod-P): P);

}

退出(EXIT _ SUCCESS);

} //main

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/147924.html

(0)

相关推荐

  • 如何使用ML.NET实现基于RFM模型的客户价值分析

    技术如何使用ML.NET实现基于RFM模型的客户价值分析本篇文章为大家展示了如何使用ML.NET实现基于RFM模型的客户价值分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。RF

    攻略 2021年11月10日
  • IE7.JS怎样解决IE兼容性问题

    技术IE7.JS怎样解决IE兼容性问题这篇文章给大家介绍 IE7.JS怎样解决IE兼容性问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。和大家重点讨论一下如何使用IE7.JS解决IE兼容性问题,I

    攻略 2021年11月25日
  • 烤肉食材有哪些,烤肉的时候烤什么食材比较好吃

    技术烤肉食材有哪些,烤肉的时候烤什么食材比较好吃又到了吃烧烤的季节了,每年夏季我们家都会组织几次大型的烧烤聚会。我们家姊妹多,每个姊妹家里的儿女,孙子烤肉食材有哪些、外甥等一起过来,几十个人聚在一起特别热闹。
    我们每家都

    生活 2021年10月26日
  • 小草怎么画,怎样画简笔画“冬虫夏草”

    技术小草怎么画,怎样画简笔画“冬虫夏草”方法小草怎么画:1、在白纸上用曲线画出冬虫夏草的轮廓。
    2、再用一条弯曲的曲线画出虫子的形态,这是一种冬天的形状。
    3、用曲线画出它的尾巴部分,这其实就像根须一样。
    4、再用小线条

    生活 2021年10月31日
  • 怎么利用Outlook来创建基于电子邮件的持久化后门

    技术怎么利用Outlook来创建基于电子邮件的持久化后门本篇内容主要讲解“怎么利用Outlook来创建基于电子邮件的持久化后门”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎

    攻略 2021年10月22日
  • C++11中和动态数组相关的新特性有哪些

    技术C++11中和动态数组相关的新特性有哪些本篇内容介绍了“C++11中和动态数组相关的新特性有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大

    攻略 2021年11月25日