博客总结
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了博客总结相关的知识,希望对你有一定的参考价值。
还是先反思一下最近的学习状态。真的懈怠了很多,我总是想去完成制定的计划,但执行起来往往总是力不从心,心思没办法集中。开始以为要做的事情太多,不知道从哪里下手引发的迷茫,之后便越来越懒惰,每天背单词、学ACM的时间都没法保证,真的让我十分担忧。
不能总这样下去,我还有目标没有实现,不单单是ACM,无论哪件事都需要自己全力以赴二点去做,不要去小看别人付出的执着和努力。我能做的只是更加执着,更加努力。最后,劝勉自己一段话:勤奋到疯狂,孤独到兴奋,好胜到桀骜。
本周学习内容:
1.鸽巢定理、扩展欧拉定理
2.杨辉三角形和二项式系数
3.容斥原理
4.Fibonacci数列
5.一些洛谷题和 div3 D,E两题总结
鸽巢定理
本质就是排列组合问题。学好概率论写这类题目,就很easy了,不多说明。
hdu 1205"吃糖果问题"
隔板法解决:一个基本的组合问题。找出种类数量最多的糖果数,数量N看成n个隔板,其他种类的糖果数和记为S。隔板可放第一个、最后一个都可以放。因此,如果n-1>s,则说明隔板太多,代表隔板这类的糖果肯定会重复放,肯定不成立;而n-1<=s,由于隔板种类的糖果数量最多,因此一个隔板内的糖果可为不同类,满足条件。
欧拉定理:φ(n) 表示小于等于 n 的正整数中与 nn 互质的数的个数(欧拉函数)。
a 与 m 互质时,a 的φ(m)次放方 ≡ 1 mod m
扩展欧拉定理:无需 a,m互质。
b≥φ(m)时, a的b次方 ≡ a的(b mod(φ(m))+φ(m))次方 mod m
杨辉三角形和二项式系数
杨辉三角是二项式系数的典型应用。本质是(1+x)的n次方前的系数。将复杂度降为O(1),由于要用到 n!,而且30的阶乘便已经超过了long long的范围。相邻两项相除,得到公式 (n-k+1)/k
补充一些数论知识:
#include <bits/stdc++.h>
using namespace std;
const int mod=10007;
const int N=1005;
typedef long long ll;
int c[N][N];
int go(int a,int b) //快速幂
{
int res=1;
while(b)
{
if(b&1) res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res%mod;
}
int dfs(int n,int m) //递归求解c(n,m)
{
if(m==0) return c[n][m]=1;
if(m==1) return c[n][m]=n;
if(n-m<m) m=n-m; //降低复杂度
return c[n][m]=(dfs(n,m-1)+dfs(n-1,m-1))%mod;
}
int main()
{
int a,b,k,n,m;
cin>>a>>b>>k>>n>>m;
a%=mod;b%=mod;
int ans=1;
ans=(go(a,n)%mod)*(go(b,m)%mod);
if(n>m) n=m;
c[1][0]=1;c[1][1]=1;
ans*=dfs(k,n)%mod;
ans%=mod;
printf("%d",ans);
return 0;
}
容斥定理
简单的一句话:现将所有对象的数目计算出来,然后减去重复计算的部分。
P1020 导弹拦截
(还存在一点问题,我再想想吧)
#include <bits/stdc++.h>
using namespace std;
int a[100005];
int dp[100005];
int h[100005];
int main()
{
int g=1;
while(cin>>a[g]) g++;
g--;
//利用dp找一个最长下降子序列
for(int i=1;i<=g;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
{
if(a[i]<=a[j])
dp[i]=max(dp[i],dp[j]+1);
}
}
int ans=0,max1;
for(int i=1;i<=g;i++)
ans=max(ans,dp[i]);
cout<<ans<<endl;
//利用贪心最少需要几套系统
h[1]=a[1];
int k=1,min1,b;
for(int i=1;i<=g;i++)
max1=max(max1,a[i]);
for(int i=2;i<=g;i++)
{
min1=max1;
for(int j=1;j<=k;j++)
if(h[j]>=a[i]&&h[j]<=min1)
{
min1=h[j];
b=j;
}
if(min1==max1)
h[++k]=a[i];
else h[b]=a[i];
}
cout<<k<<endl;
return 0;
}
以上是关于博客总结的主要内容,如果未能解决你的问题,请参考以下文章