zoukankan      html  css  js  c++  java
  • 清北学堂培训整理7 13

    今日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
    ",a[i][n+1]);
    	return 0;
    }
    

    素数相关

    真的不想整...

    埃拉托瑟尼筛

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

    线性筛

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

    积性函数

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

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

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

    (uparrow)这个东西念(freve a i)

    这个东西有两种可能:

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

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

    2.(gcd(i,p) eq1)

    (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
    ",ans[i-1]);
    	}
    	printf("%lld
    ",ans[n]);
    	return 0;
    }
    
  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/648-233/p/11188255.html
Copyright © 2011-2022 走看看