• 多项式学习笔记


    前言:菜狗痛改前非决定认真学习多项式

    礼物

    大意:

    给定两个环形矩阵A,B,现在可以对A矩阵统一加上某一个值,并将其任意旋转,求操作过后\sum (a[i]-b[i])^{2}的最小值。

    思路:

    算是一道多项式板子题了。首先考虑将a[i]加上一个值x,那么原来的式子就可以转化为\sum(a[i]+x-b[i])^{2}=\sum a[i]^{2}+\sum b[i]^{2}+n*x^{2}+2x\sum (a[i]-b[i]) -2\sum(a[i]*b[i])

    如果我们把x看做是自变量的话,这其实就是一个关于x的二次函数,那么求它的最小值不是轻轻松松嘛,而且我们发现跟x有关的项的系数都是定值,所以x的确定值是可以直接得到的。最后,我们就只需要求最后一项的最大值就可以了。

    怎么求呢,如果我们把a数组倒过来的话,那么原式就可以转化为

    \sum_{i=1}^{n}a[n-i+1]*b[i],那么这不就是一个卷积的形式嘛,最后考虑到a数组可以任意旋转,我们就只需要将其扩大到原来的两倍然后去卷积,最后在第n+1项到第n*2项之间取最大值就可以了。

    卷积的话可以用fft,当然其实极限情况下中间变量也不会超过998244353,所以用ntt也是可以的。

    算是一道比较温柔的推柿子题了。

    (ps:c++是默认向0取整的,但是我们对正负情况的取整方向是不一样的,所以我们要分类讨论)

    code:

    1. #include
    2. using namespace std;
    3. #define ll long long
    4. #define IL inline
    5. #define ull unsigned long long
    6. #define clr(f,n) memset(f,0,sizeof(int)*(n))
    7. #define cpy(f,g,n) memcpy(f,g,sizeof(int)*(n))
    8. const int _G=3,mod=998244353,Maxn=1e5+10;
    9. namespace FastIOT{
    10. const int bsz=1<<18;
    11. char bf[bsz],*hed,*tail;
    12. inline char gc(){if(hed==tail)tail=(hed=bf)+fread(bf,1,bsz,stdin);if(hed==tail)return 0;return *hed++;}
    13. template<typename T>IL void read(T &x){T f=1;x=0;char c=gc();for(;c>'9'||c<'0';c=gc())if(c=='-')f=-1;
    14. for(;c<='9'&&c>='0';c=gc())x=(x<<3)+(x<<1)+(c^48);x*=f;}
    15. template<typename T>IL void print(T x){if(x<0)putchar(45),x=-x;if(x>9)print(x/10);putchar(x%10+48);}
    16. template<typename T>IL void println(T x){print(x);putchar('\n');}
    17. }
    18. using namespace FastIOT;
    19. int F[Maxn<<2],FF[Maxn<<2],G[Maxn<<2],n,m;
    20. int pfa,pfb,det;
    21. ll powM(ll a,ll t=mod-2)
    22. {
    23. ll ans=1;
    24. while(t)
    25. {
    26. if(t&1)ans=ans*a%mod;
    27. a=a*a%mod;t>>=1;
    28. }
    29. return ans;
    30. }
    31. const int invG=powM(_G);
    32. int tr[Maxn<<2],tf;
    33. void tpre(int n)
    34. {
    35. if (tf==n)return ;tf=n;
    36. for(int i=0;i
    37. tr[i]=(tr[i>>1]>>1)|((i&1)?n>>1:0);
    38. }
    39. void NTT(int *g,bool op,int n)
    40. {
    41. tpre(n);
    42. static ull f[Maxn<<2],w[Maxn<<2]={1};
    43. for (int i=0;i5)+g[tr[i]])%mod;
    44. for(int l=1;l1)
    45. {
    46. ull tG=powM(op?_G:invG,(mod-1)/(l+l));
    47. for (int i=1;i-1]*tG%mod;
    48. for(int k=0;k
    49. for(int p=0;p
    50. {
    51. int tt=w[p]*f[k|l|p]%mod;
    52. f[k|l|p]=f[k|p]+mod-tt;
    53. f[k|p]+=tt;
    54. }
    55. if (l==(1<<10)) for (int i=0;i
    56. }
    57. if (!op)
    58. {
    59. ull invn=powM(n);
    60. for(int i=0;i
    61. g[i]=f[i]%mod*invn%mod;
    62. }
    63. else for(int i=0;i
    64. }
    65. void px(int *f,int *g,int n)
    66. {for(int i=0;i1ll*f[i]*g[i]%mod;}
    67. void times(int *f,int *g,int len,int lim)
    68. {
    69. static int sav[Maxn<<2];
    70. int n=1;for(n;n1);
    71. clr(sav,n);cpy(sav,g,n);
    72. NTT(f,1,n);NTT(sav,1,n);
    73. px(f,sav,n);NTT(f,0,n);
    74. clr(f+lim,n-lim);clr(sav,n);
    75. }
    76. void solve()
    77. {
    78. read(n);read(m);
    79. //cout<
    80. for(int i=0;i
    81. {
    82. read(FF[i]);
    83. pfa+=FF[i]*FF[i];
    84. }
    85. for(int i=0;i
    86. {
    87. read(G[i]);
    88. pfb+=G[i]*G[i];
    89. det+=FF[i]-G[i];
    90. }
    91. for(int i=0;i
    92. {
    93. F[i]=FF[n-i-1];
    94. F[n+i]=F[i];
    95. }
    96. times(F,G,n*2,n*3);
    97. ll ma=0;
    98. for(int i=n;i2;++i) ma=max(ma,(ll)F[i]);
    99. ma<<=1;
    100. det<<=1;
    101. double xx=-1.0*det/n/2.000;
    102. if(xx>0) xx=(ll)(xx+0.5);
    103. else xx=(ll)(xx-0.5);
    104. //printf("%d %f\n",det,xx);
    105. ll ans=0;
    106. ans+=pfa+pfb+xx*xx*n+det*xx;
    107. ans-=ma;
    108. printf("%lld\n",ans);
    109. }
    110. int main()
    111. {
    112. //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    113. solve();
    114. return 0;
    115. }

  • 相关阅读:
    【SpringBoot实战系列】阿里云OSS接入上传图片实战
    手把手教你 在IDEA搭建 SparkSQL的开发环境
    解决笔记本无线网络5G比2.4还慢的奇怪问题
    停止像这样使用 “async/await“,改用原版
    端口转发配置
    C++11新特性学习笔记
    鸡卵清白蛋白偶联石杉碱甲(Huperzine-OVA/Ovalbumin)的产品介绍
    模型运行过程中占内存的中间变量
    “JavelinRecordDistance“ app Tech Support(URL)
    Java按位取反操作~
  • 原文地址:https://blog.csdn.net/sophilex/article/details/127591030