鸽巢原理
原理1: 把多于n+1个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。
原理2:把多于mn+1(n不为0)个的物体放到n个抽屉里,则至少有一个抽屉里有不少于m+1的物体。
原理3:把无数多件物体放入n个抽屉,则至少有一个抽屉里有无数个物体。
原理4:把mn-1个物体放入n个抽屉中,其中必有一个抽屉中至多有m-1个物体。
hdu 1205
只考虑最多的一种糖果的数量和其余所有的糖果总数之间的关系
hdu 1808
Ramsey定理
hdu 5917
使用ramsey定理,大于等于6的情况直接判断
3,4,5的情况特判
hdu 6152
和上题一样
已知的Ramsey数
容斥原理
hdu 4135
题意:就是让你求(a,b)区间于n互质的数的个数
转化为先求出(1,m)区间与n不互质的数的个数:先求出n的质因子,再利用容斥原理
难点:如何模拟容斥原理
#include<cstdio>
#include<cstring>
using namespace std;
int prime[33],pn;
long long calc(long long n)
{
long long res=0;
for(int i=1; i<(1<<pn); ++i){
int tmp=1,cnt=0;
for(int j=0; j<pn; ++j){
if(((i>>j)&1)==0) continue;
++cnt;
tmp*=prime[j];
}
if(cnt&1) res+=n/tmp;
else res-=n/tmp;
}
return n-res;
}
int main()
{
long long a,b;
int t,n;
scanf("%d",&t);
for(int cse=1; cse<=t; ++cse){
scanf("%lld%lld%d",&a,&b,&n);
pn=0;
for(int i=2; i*i<=n; ++i){
if(n%i) continue;
while(n%i==0) n/=i;
prime[pn++]=i;
}
if(n!=1) prime[pn++]=n;
printf("Case #%d: %lld\n",cse,calc(b)-calc(a-1));
}
return 0;
}
hdu 2841
比上题多一个枚举
hdu 4497
正数分解定理+组合数学
有一定的思维成分
**hdu 5155
比较难想,常规做法是dp
斐波拉契数列
hdu3117
第一亿个斐波那契数,矩阵快速幂有
hdu2041
隐藏的斐波那契,其实更应该说是递推
母函数(生成函数)
母函数的原理:
把组合问题的加法与幂级数的乘幂对应起来
hdu1028
整数划分题
常规做法是dp
*dp[n][m]=dp[n][m-1]+dp[n-m][m]*还没搞懂
hdu1521
指数类型的母函数
特殊计数
稍后待补