2019/4/1 奇奇怪怪的笔记

整理了一些之前没有写过的东西,把它们拼在一起,并没有什么逻辑可言qwq

FWT快速沃尔什变换

\[FWT(A)=merge(FWT(A0),FWT(A0+A1))
\]

\[FWT(A)=merge(FWT(A0+A1),FWT(A1))
\]

\[FWT(A)=merge(FWT(A0+A1),FWT(Ao-A1))
\]

  1. void FWT(int *a,const int n,int type)
  2. {
  3. for(int i=1;i<n;i<<=1)for(int j=0;j<n;j+=i<<1)for(k=0;k<len;++k)
  4. {
  5. int x=a[j+k],y=a[i+j+k];
  6. a[j+k]=x;a[i+j+k]=(type*x+y)%P;
  7. }
  8. }

杜教筛

问题:求\(S(n)=\sum_{i=1}^{n}f(i)\)

考虑:

构造函数\(g(x)\)

\[\begin{equation}
\begin{split}
&\sum_{i=1}^{n}(f*g)(i)\\
=&\sum_{d=1}^{n}\sum_{i=1}^{\frac{n}{d}}g(d)f(i)\\
=&\sum_{d=1}^{n}g(d)S(\frac{n}{d})\\
=&g(1)S(n)+\sum_{d=2}^{n}g(d)S(\frac{n}{d})
\end{split}
\end{equation}
\]

所以:

\[S(n)=\frac{\sum_{i=1}^{n}(f*g)(i)-\sum_{d=2}^{n}g(d)S(\frac{n}{d})}{g(1)}
\]

要找到一个使得\(g\)和\(f*g\)的前缀和都很好算的。

实现:将\(S(n)\)存入数组\(⌊\frac{n}{x}⌋\)位,防止冲突

为什么不会冲突呢,考虑\(\frac{n}{i}\)的\(O(\sqrt n)\)个的商,这些商的商,必然属于\(O(\sqrt n)\)个的商中

为什么呢?

假设:\(n=kd+r,r\leq d\\k=le+s,s\leq e\)

那么就有:\(n=(ed)l+sd+r,sd+r\leq ed\)

所以我们其实只访问了\(O(\sqrt n)\)个的\(S(i)\),把它们都存储在\(⌊\frac{n}{i}⌋\)

这个值其实是满足\([\frac{n}{i}]=x\)的最大\(x\)值,显然是不会冲突的

\[\mu* 1 = \epsilon\\
\varphi* 1 = id_1\\id_1 * \mu = \varphi
\]

\[∑_{i=1}^{n}id_2(i)=\frac{n(n+1)(2n+1)}{6}
\]

\[\sum id_3(i)=(\sum id_1 i)^2
\]

  1. typedef pair<ll, int> pli;
  2. const int B = 1664510, S = 1291;
  3. int n, T;
  4. ll SumPhi[B + 5], ResPhi[S + 5];
  5. int SumMu[B + 5], ResMu[S + 5];
  6. namespace Pac
  7. {
  8. void init()//初始化:线筛求出前B=n^{3/2}
  9. {
  10. static int cnt, vis[B + 5], prime[B + 5], phi[B + 5], mu[B + 5];
  11. phi[1] = mu[1] = 1;
  12. for (int i = 2; i <= B; i++)
  13. {
  14. if (!vis[i])
  15. {
  16. prime[cnt++] = i;
  17. phi[i] = i - 1;
  18. mu[i] = -1;
  19. }
  20. for (int j = 0, t; j < cnt && (t = i * prime[j]) <= B; j++)
  21. {
  22. vis[t] = 1;
  23. if (i % prime[j] == 0)
  24. {
  25. phi[t] = phi[i] * prime[j];
  26. mu[t] = 0;
  27. break;
  28. }
  29. phi[t] = phi[i] * (prime[j] - 1);
  30. mu[t] = -mu[i];
  31. }
  32. }
  33. for (int i = 1; i <= B; i++)
  34. {
  35. SumPhi[i] = SumPhi[i - 1] + phi[i];
  36. SumMu[i] = SumMu[i - 1] + mu[i];
  37. }
  38. }
  39. bool vis[S + 5];
  40. pli GetSum(const int x) //求和部分
  41. {
  42. if (x <= B) return pli(SumPhi[x], SumMu[x]);
  43. int t = n / x;
  44. if (!vis[t])
  45. {
  46. vis[t] = 1;
  47. ResPhi[t] = ((ll)x + 1) * x / 2;//phi*1=id_1
  48. ResMu[t] = 1;//mu*1=ep
  49. for (uint l = 2, r; l <= x; l = r + 1)
  50. {
  51. pli res = GetSum(x / l);
  52. r = x / (x / l);
  53. ResPhi[t] -= (r - l + 1) * res.first;
  54. ResMu[t] -= (r - l + 1) * res.second;
  55. }
  56. }
  57. return pli(ResPhi[t], ResMu[t]);
  58. }
  59. void work()
  60. {
  61. init();
  62. scanf("%d", &T);
  63. while (T--)
  64. {
  65. scanf("%d", &n);
  66. memset(vis + 1, 0, sizeof(bool) * n / B);
  67. pli ans = GetSum(n);
  68. printf("%lld %d\n", ans.first, ans.second);
  69. }
  70. }
  71. }

最小圆覆盖[随机增量法]

随机大法好

只需要确定三个点,答案即为它们的外接圆

每次加点,如果不属于之前的圆,再枚举另外两个点,确定圆即可

看上去是\(O(n^3)\)的,实际期望是\(O(n)\)

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define ld long double
  4. #define max(a,b) ((a)>(b)?(a):(b))
  5. #define min(a,b) ((a)>(b)?(b):(a))
  6. #define reg register
  7. using namespace std;
  8. const int MN=100005;
  9. const ld eps=1e-12;
  10. int N;ld R;
  11. struct P
  12. {
  13. ld x,y;
  14. P(ld _x=0,ld _y=0):x(_x),y(_y){}
  15. }a[MN],O;
  16. inline P operator + (const P&o,const P&oo){return P(o.x+oo.x,o.y+oo.y);}
  17. inline P operator - (const P&o,const P&oo){return P(o.x-oo.x,o.y-oo.y);}
  18. inline P operator * (const P&o,const ld k){return P(o.x*k,o.y*k);}
  19. inline ld dot(const P&o,const P&oo){return o.x*oo.x+o.y*oo.y;}
  20. inline ld len(const P&o){return sqrt(dot(o,o));}
  21. inline ld dis(const P&o,const P&oo){return sqrt((o.x-oo.x)*(o.x-oo.x)+(o.y-oo.y)*(o.y-oo.y));}
  22. inline ld cross(const P&o,const P&oo){return o.x*oo.y-o.y*oo.x;}
  23. inline P Mid(const P&A,const P&B){return P((A.x+B.x)/2,(A.y+B.y)/2);}
  24. //中垂线
  25. inline void Vertical(const P&A,const P&B,P&p,P&v){p=Mid(A,B);P tmp=B-A;v.x=-tmp.y,v.y=tmp.x;}
  26. //外接圆
  27. /*
  28. P=A+(CA x CD)/(CD x AB) AB
  29. */
  30. inline void Circle(const P&A,const P&B,const P&C)
  31. {
  32. P p,q,v,w;Vertical(A,B,p,v),Vertical(A,C,q,w);
  33. P u=p-q;
  34. ld t=cross(w,u)/cross(v,w);
  35. O=p+v*t,R=dis(O,A);
  36. }
  37. int main()
  38. {
  39. scanf("%d",&N);
  40. reg int i,j,k;
  41. for(i=1;i<=N;++i)scanf("%Lf%Lf",&a[i].x,&a[i].y);
  42. random_shuffle(a+1,a+N);
  43. O=a[1],R=0;
  44. for(i=2;i<=N;++i)if(dis(a[i],O)>R)
  45. {
  46. O=a[i],R=0;
  47. for(j=1;j<i;++j)if(dis(a[j],O)>R)
  48. {
  49. O=Mid(a[i],a[j]),R=dis(a[i],O);
  50. for(k=1;k<j;++k)if(dis(a[k],O)>R)Circle(a[i],a[j],a[k]);
  51. }
  52. }
  53. printf("%.10f\n%.10f %.10f",(double)R,(double)O.x,(double)O.y);
  54. return 0;
  55. }

MTT(任意模数NTT)

求\(F(x)*G(x) \mod a\)

\(1\leq n,m\leq 10^5,0\leq f_i,g_i\leq10^9,2\leq p\leq 10^9+9\)

法一:

卷积后每一位不超过\(10^{24}\)

考虑对三个模数:\(469762049,998244353,1004535809\),分别作\(NTT\),然后采用\(CRT\)合并

这\(3\)个质数的原根均为\(3\)

考虑\(CRT\)合并怎么做

先合并前两个数,再合并后面两个

但是要用快速乘:

  1. inline ll mul(ll a, ll b,const ll p)
  2. {
  3. static const long double eps = 1e-8;
  4. a = (a % p + p) % p;
  5. b = (b % p + p) % p;
  6. return ((a * b - ll((long double)a / p * b + eps) * p) % p + p) % p;
  7. }

完整代码


  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define reg register
  5. #define max(a,b) ((a)>(b)?(a):(b))
  6. #define min(a,b) ((a)<(b)?(a):(b))
  7. inline int read()
  8. {
  9. int x=0,f=1;char ch=getchar();
  10. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  11. while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  12. return x*f;
  13. }
  14. const int N=1<<20|5,mod[]={469762049,998244353,1004535809},g=3;
  15. #define Mul(a,b,p) (1ll*(a)*(b)%(p))
  16. inline int fpow(int x,int m,int p){int r=1;for(;m;m>>=1,x=Mul(x,x,p))if(m&1)r=Mul(r,x,p);return r;}
  17. int pos[N],MOD,len,di,F[N],G[N];
  18. struct Polynomial
  19. {
  20. int P,invg,r[N];
  21. void NTT(int *a,int n,int type)
  22. {
  23. reg int i,j,p,k,w,wn,X,Y;
  24. for(i=0;i<n;++i) if(i<pos[i]) std::swap(a[i],a[pos[i]]);
  25. for(i=1;i<n;i<<=1)
  26. {
  27. wn=fpow(type>0?g:invg,(P-1)/(i<<1),P);
  28. for(p=i<<1,j=0;j<n;j+=p)
  29. for(w=1,k=0;k<i;++k,w=Mul(w,wn,P))
  30. {
  31. X=a[j+k];Y=Mul(w,a[j+k+i],P);
  32. a[j+k]=(X+Y)%P;a[j+k+i]=(X-Y+P)%P;
  33. }
  34. }
  35. reg int invn=fpow(n,P-2,P);
  36. if(type==-1)for(i=0;i<n;++i)a[i]=Mul(a[i],invn,P);
  37. }
  38. void combine(int *A,int *B,int n)
  39. {
  40. memcpy(F,A,sizeof(int[n]));
  41. memcpy(G,B,sizeof(int[n]));
  42. NTT(F,n,1),NTT(G,n,1);
  43. for(reg int i=0;i<n;++i)r[i]=Mul(F[i],G[i],P);
  44. NTT(r,n,-1);
  45. }
  46. }poly[3];
  47. int a[N],b[N];
  48. inline ll mul(ll a,ll b,ll p)
  49. {
  50. static const long double eps=1e-8;
  51. a=(a%p+p)%p;b=(b%p+p)%p;
  52. return ((a*b-(ll)((long double)a/p*b+eps)*p)%p+p)%p;
  53. }
  54. //t0=a0p1 inv(p1,p0),a1p0 inv(p0,p1) mod p0p1
  55. //t1=(a2-t0)p0^{-1}p1^{-1}
  56. //ans=t1p0p1+t0
  57. void CRT(int n)
  58. {
  59. ll t0,t1;
  60. int p0=mod[0],p1=mod[1],p2=mod[2];
  61. int *u=poly[0].r,*v=poly[1].r,*w=poly[2].r;
  62. ll p0p1=1ll*p0*p1;
  63. ll _p0p1=mul(fpow(p0,p2-2,p2),fpow(p1,p2-2,p2),p2);
  64. ll _0=mul(p1,fpow(p1,p0-2,p0),p0p1);
  65. ll _1=mul(p0,fpow(p0,p1-2,p1),p0p1);
  66. for(reg int i=0;i<n;++i)
  67. {
  68. t0=(mul(u[i],_0,p0p1)+mul(v[i],_1,p0p1))%p0p1;
  69. t1=mul((w[i]-t0%p2+p2)%p2,_p0p1,p2);
  70. printf("%d ",int((mul(t1,p0p1,MOD)+t0%MOD)%MOD));
  71. }
  72. }
  73. int main()
  74. {
  75. reg int n,m,i;
  76. n=read()+1;m=read()+1;MOD=read();
  77. for(i=0;i<n;++i) a[i]=read();
  78. for(i=0;i<m;++i) b[i]=read();
  79. for(len=1;len<n+m;len<<=1,di++);
  80. for(i=0;i<len;++i) pos[i]=(pos[i>>1]>>1)|((i&1)<<(di-1));
  81. for(i=0;i<3;++i)
  82. {
  83. poly[i].P=mod[i];
  84. poly[i].invg=fpow(g,mod[i]-2,mod[i]);
  85. poly[i].combine(a,b,len);
  86. }
  87. CRT(n+m-1);
  88. return 0;
  89. }

法二:

设\(p=\sqrt p\),向上取整

把每个数表示成\(X=a_xp+b_x\)

那么就有\(ans_i=\sum_{x+y=i}a_xa_yp^2+(a_xb_y+b_xa_y)p+b_xb_y\)

分别用\(FFT\)即可

大概就这些?

接下几天会陆续补齐多项式全家桶(其实只是为了更熟练地打\(FFT\) )吧,不做一只鸽子,嗯呐


Blog来自PaperCloud,未经允许,请勿转载,TKS!

Note_3.31的更多相关文章

  1. 城市代码表mysql

    只有代码: # ************************************************************ # Sequel Pro SQL dump # Version ...

  2. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  3. 计算机程序的思维逻辑 (31) - 剖析Arrays

    数组是存储多个同类型元素的基本数据结构,数组中的元素在内存连续存放,可以通过数组下标直接定位任意元素,相比我们在后续章节介绍的其他容器,效率非常高. 数组操作是计算机程序中的常见基本操作,Java中有 ...

  4. SQL Server查询第31到40条数据

    大致分为两种情况:ID连续和ID不连续. 1.ID连续的情况: 2.ID不连续的情况: (1).两次对表查询,效率较低. ID from A) (2).外层查询没有对表A进行查询,效率提高. ID f ...

  5. 把《c++ primer》读薄(3-1 标准库string类型初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...

  6. 背水一战 Windows 10 (31) - 控件(按钮类): ButtonBase, Button, HyperlinkButton, RepeatButton, ToggleButton, AppBarButton, AppBarToggleButton

    [源码下载] 背水一战 Windows 10 (31) - 控件(按钮类): ButtonBase, Button, HyperlinkButton, RepeatButton, ToggleButt ...

  7. Lind.DDD.Manager里的3,7,15,31,63,127,255,511,1023,2047

    回到目录 进制 我是一个程序猿,我喜欢简单的数字,十进制如何,数字太多,有10种数字组成,但由于它广为人知,所有使用最为广泛,人们的惯性思维培养了十进制,并说它是最容易被计算的数字,事实上,在计算机里 ...

  8. 2017年1月5日 星期四 --出埃及记 Exodus 21:31

    2017年1月5日 星期四 --出埃及记 Exodus 21:31 This law also applies if the bull gores a son or daughter.牛无论触了人的儿 ...

  9. 2016年12月31日 星期六 --出埃及记 Exodus 21:26

    2016年12月31日 星期六 --出埃及记 Exodus 21:26 "If a man hits a manservant or maidservant in the eye and d ...

随机推荐

  1. spring cloud gateway 深入了解 - Predicate

    文章来源 spring cloud gateway 通过谓词(Predicate)来匹配来自用户的请求 为了方便,使用postman测试不同的谓词的效果 路径谓词(Predicate)—— 最简单的谓 ...

  2. Java自学-数字与字符串 StringBuffer

    Java StringBuffer常见方法 StringBuffer是可变长的字符串 示例 1 : 追加 删除 插入 反转 append追加 delete 删除 insert 插入 reverse 反 ...

  3. python基础01day

    1 python多版本共存 因为python2和python3的解释器程序都是python.exe,在同时加入环境变量的情况下名称重复,如果重命名的话又会造成需要链接解释器的程序无法调用解释器,所以采 ...

  4. layui 表格中实现照片预览,点击查看原图

    人员表格中实现照片预览,并且可点击放大.查看原图 <table id="dutyInfoTable" class="layui-hide">< ...

  5. 另类WebShell监测机制--基于auditd

    鸣  谢 VSRC感谢业界小伙伴——老陈投稿精品原创类文章.VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送,我们为您准备的丰富奖品包括但不仅限于:MacbookAir.VSRC定制 ...

  6. python实现广度优先搜索

    from collections import deque #解决从你的人际关系网中找到芒果销售商的问题#使用字典表示映射关系graph = {} graph["you"] = [ ...

  7. 025:为什么需要将Logger对象声明为private static final类型的

    本文阅读时间大约4分钟. 参考答案 就这个问题而言,我总结了三个原因: 设置为private是为了防止其他类使用当前类的日志对象: 设置为static是为了让每个类中的日志对象只生成一份,日志对象是属 ...

  8. HBase的部署与其它相关组件(Hive和Phoenix)的集成

    HBase的部署与其它相关组件(Hive和Phoenix)的集成 一.HBase部署 1.1.Zookeeper正常部署 首先保证Zookeeper集群的正常部署,并启动之: /opt/module/ ...

  9. 自定义View(三),仿支付宝芝麻信用自定义控件

    仿支付宝的芝麻信用仪表盘 实现的效果 实现的功能: 指针和数字动态改变 背景动态变化 没了... 代码如下 MyCustomView.java package com.example.testcust ...

  10. 马哥docker听课记录

    容器技术:chroot.namespaces.cgroups docker平时用户空间只运行一个进程,只运行在一个namespaces中 镜像:分层构建.联合挂载 容器编排工具:kubernetes ...