51nod 1172 Partial Sums V2 卡精度的任意模数FFT

卡精度的任意模数fft模板题……
这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.
然后我就去网上抄了一下板子……
我打的是最土的任意模数fft,就是fft7次的那种……(好像有很多方法的样子……)
这种任意模数fft方法见http://blog.youkuaiyun.com/l_0_forever_lf/article/details/52886397
这道题的具体做法见http://blog.youkuaiyun.com/qq_33229466/article/details/78837522
这种方法的思想就是:
  I.既然出题人给出了任意模数的多项式乘法,那么常规ntt肯定是不行
  II.既然他取模,那数会很大,会炸精,常规的fft也不行
  III.既然直接乘会炸精,那我们就把数变小,多跑几次也没关系
(IV.感觉加了一维卷积,有种这种方法很妙,可以继续扩展的感觉,但是很模糊,也说不具体)
本着这种思路,我们逆变换的时候,不能在点值表达式直接操作,最后一遍回去,因为这样效果和没有在一开始把数缩小一样,会炸精.
最后说一下这道题的坑点:如果你不预处理复数,你会炸精.
好像有的人没有预处理,但是用了long double,就没有被卡……
似乎cmath库里有标准库也有类库,而且有的函数两者并不都具有,但是最坑爹的一点是对于sin,cos等函数,cmath标准库的精度大于cmath类库……(这只是我经过亲身试验做出的推测)
反正预处理就没有这些破事……

#include <cmath>
#include <cstdio>
#include <cstring>
#include <complex>
#include <algorithm>
typedef long long LL;
typedef double db;
typedef std::complex<db> cd;
const int N=200010;
const db Pai=acos((db)-1);
const int P=1000000007;
cd a1[N],b1[N],a2[N],b2[N],c1[N],c2[N],c3[N],w1[N],w2[N];
int rev[N],len;
int ai[N],bi[N],ans[N],ni[N];
inline void fft(cd *C,int opt,cd *wn){
  register int i,j,k;cd temp;
  for(i=1;i<len;++i)if(rev[i]>i)std::swap(C[i],C[rev[i]]);
  for(k=2;k<=len;k<<=1){
    for(i=0;i<len;i+=k){
      for(j=0;j<(k>>1);++j){
        temp=C[i+j+(k>>1)]*wn[len/k*j];
        C[i+j+(k>>1)]=C[i+j]-temp;
        C[i+j]+=temp;
      }
    }
  }
  if(opt==-1){
    db inv=1./len;
    for(i=0;i<len;++i)C[i]*=inv;
  }
}
inline void Mul(int *a,int *b,int *c,int n){
  len=1;
  while(len<n)len<<=1;
  int i,sqr=sqrt(P);
  cd temp;
  for(i=1;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
  for(i=0;i<len;++i){
    w1[i]=cd(std::cos(2.*Pai/len*i),std::sin(2.*Pai/len*i));
    w2[i]=cd(std::cos(-2.*Pai/len*i),std::sin(-2.*Pai/len*i));
  }
  for(i=0;i<len;++i){
    a1[i]=ai[i]/sqr,b1[i]=ai[i]%sqr;
    a2[i]=bi[i]/sqr,b2[i]=bi[i]%sqr;
  }
  fft(a1,1,w1),fft(b1,1,w1),fft(a2,1,w1),fft(b2,1,w1);
  for(i=0;i<len;++i){
    c1[i]=a1[i]*a2[i];
    c2[i]=a1[i]*b2[i]+a2[i]*b1[i];
    c3[i]=b1[i]*b2[i];
  }
  fft(c1,-1,w2),fft(c2,-1,w2),fft(c3,-1,w2);
  for(i=0;i<len;++i)
    c[i]=((LL)(round(c1[i].real()))%P*sqr%P*sqr%P+(LL)(round(c2[i].real()))%P*sqr%P+(LL)(round(c3[i].real()))%P)%P;
}
int main(){
  int n,k,i;
  scanf("%d%d",&n,&k);
  for(i=0;i<n;++i)scanf("%d",&ai[i]);
  bi[0]=1;
  for(i=1;i<n;++i)
    bi[i]=(LL)bi[i-1]*(k+i-1)%P*(i==1?ni[i]=1:ni[i]=(-(LL)(P/i)*ni[P%i]%P+P)%P)%P;
  Mul(ai,bi,ans,n<<1);
  for(i=0;i<n;++i)printf("%d\n",ans[i]);
  return 0;
}

 

转载于:https://www.cnblogs.com/TSHugh/p/8490076.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值