清北学堂培训整理7 13

it2022-05-05  103

今日wz来相会,相与坐在机房中

心中但念此客贵,忙请大佬入座中

不知触控何处关,大佬悠然敲键盘

重启过后猛然觉,博客未存车已翻

译文:关闭触控板重启以后发现博客没存

我尽量还原

补下昨天贪心:

看到这道题第一感觉就是让快的来回跑,送人就行

看下样例:

易证,如果让快的来回送(就是1),需要20分钟

然而这个17怎么来的?

考虑以下方案:

先让1和2过河,1回来送手电筒 3分钟

再让5和10过去,2回来送 12分钟

最后1和2过去 2分钟

共17分钟

看一看样例可得,如果只派最快的人来回跑,让他去接非常慢的人是一种浪费,

那么考虑让最慢的和次慢的去跑,这样可以不浪费最快的"才华"(才华缩写是CH)

所以这个其实是个动归?

1.最小带最大

\(dp_i=dp_{i-1}+a_i+a_1\)

2.最小带第2小,最小回来,最大2人过去,第二小回来

\(dp_i=dp_{i-2}+a_i+a_1+2a_2\)

所以就是这样的:

\(dp_i=min(dp_{i-1}+a_i+a_1,dp_{i-2}+a_i+a_1+2a_2)\)

数论

高精加

之前整过,代码好写,思路简单,不作整理

高精乘

之前整过,代码好写,思路简单,不作整理

高精减

之前整过,代码好写,思路简单,不作整理

高精除低精

之前整过,代码好写,思路简单,不作整理

高精除高精

先将位数对齐,然后从高位到低位进行比较,大了就除,小了这位是0

然后将被除数各位减去除数对应位数

当然在减的过程中需要处理借位

最后处理前导0

细节很多,慢慢看

高精开根

矩阵

首先声明1点:矩阵乘法所用的循环变量k在内层

我把这玩意记错了好久

快速幂

原理如普通快速幂,就是把*运算正确地重载运算符

然后一波乘,一波快速幂

这个东西可以用在矩阵加速上

矩阵加速

众所周知,矩阵(乘法,加速啥的)可以用来求数列第\(n\)相,鬼知道为什么

具体原理就是...

高斯消元

一个很重要的东西,

思路很简单,就是小学求二元一次方程组的道理

只是把它扩大了

理论给出阐述:

其目的就是消为一个这样的矩阵:

2 0 0 6

0 3 0 6

0 0 3 6

可以求n元方程的解

就是每次将第\(i\)行的第\(i-1\)项消为0

然后消成倒三角后再反着消回来

高斯消元

会了理论ta就是个dd简单模拟题

贴下代码:

#include<bits/stdc++.h> using namespace std; int n; double a[105][105]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); } for(int i=1;i<=n;i++){ int t=i; while(a[t][i]==0&&t<=n) t++; if(t==n+1){ cout<<"No Solution"; return 0; } for(int j=1;j<=n+1;j++) swap(a[t][j],a[i][j]); double x=a[i][i]; for(int j=1;j<=n+1;j++) a[i][j]/=x; for(int j=1;j<=n;j++){ if(j==i) continue; x=a[j][i]; for(int k=1;k<=n+1;k++){ a[j][k]-=x*a[i][k]; } } } for(int i=1;i<=n;i++) printf("%0.2lf\n",a[i][n+1]); return 0; }

素数相关

真的不想整...

埃拉托瑟尼筛

之前整过,代码好写,思路简单,不作整理

线性筛

之前整过,代码好写,思路虽然不是那么很简单,但是不作整理

积性函数

之前没整这次好好听(说实话之前的博客太水了)

欧拉函数变式一下就是这样:

\(\phi(n)=\prod (p_i-1)p_i^{q_{i-1}}\)

\(\uparrow\)这个东西念\(f\breve a i\)

这个东西有两种可能:

1.\(gcd(i,p)=1\)

\(phi[i*p]=phi[i]*phi[p]\)

2.\(gcd(i,p)\neq1\)

\(phi[i*p]=phi[i]*p\)

这个东西可以在线性筛(欧拉筛)中顺带求出

顺带一提,莫比乌斯函数是完全积性函数

这个东西也是积性函数

这个东西本身是乘法原理

注意这里的\(q_i\)指的是指数\(p_i\)的次数

然后就考虑从\(k\)个物品中取物(可以不取),求方案数

因为不取也是一种方案,所以要+1

最 大 公 约 数

就是\(gcd\)!

我为啥这么高兴?

因为这个我能听懂!

朴素算法

之前没整过,但代码好写,思路简单,不作整理

辗转相除

之前整过,代码好写,思路简单,不作整理

原理不作解释,下面放一个二进制求\(gcd\)

这个东西因为只有位运算,比较快

BFS

这里的BFS并非\(breath\ first\ search\)

\(best\ first\ seach\)

贪心搜索

然而其致命之处就是"不够聪明"

然后把这两个东西结合,

就是"启发式搜索"

这个东西其中变量的具体意义在下面

就是说,这种算法需要先估计优方案,然后如果发现再进行搜索

裴蜀定理

其实我早就选择背下来了...

这个可以求解不定方程

当然也可以线性求逆元...

代码:

#include<bits/stdc++.h> using namespace std; int n; int p; long long ans[3000005]; int main(){ int x,y; scanf("%d%d",&n,&p); ans[1]=1; for(int i=2;i<=n;i++){ ans[i]=(long long)(p-p/i)*ans[p%i]%p; printf("%lld\n",ans[i-1]); } printf("%lld\n",ans[n]); return 0; }

转载于:https://www.cnblogs.com/648-233/p/11188255.html


最新回复(0)