组合数 C(n, m) = C(n -1, m - 1) + C(n - 1, m)
#include <bits/stdc++.h>
using namespace std;
int C[35][35];
int main()
{
C[1][0] = C[1][1] = 1;
for (int i = 2; i < 35; i++)
{
C[i][0] = 1;
for (int j = 1; j <= i; j++)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]);
}
int n, m;
while(scanf("%d%d", &n, &m)!=EOF)
{
printf("%d\n", C[n][m]);
}
return 0;
}
错排 f(n)=(n-1)*(f(n-1)+f(n-2))
#include <bits/stdc++.h>
using namespace std;
//long long d=0; //递推
//long long f(int n)
//{
// if(n==1)
// return 0;
// else if(n==2)
// return 1;
// else
// d=(n-1)*(f(n-1)+f(n-2));
// return(d);
//}
//int main()
//{
// int n;
// while(scanf("%d",&n)!=EOF)
// cout << f(n) << endl;
//}
int main()
{
long long a[30];
int i,n;
a[1]=0;
a[2]=1;
for(i=3;i<30;i++)
a[i]=(i-1)*(a[i-1]+a[i-2]); //打表
while(scanf("%d",&n)!=EOF)
printf("%lld\n",a[n]);
return 0;
}
除法分块(对于一个数X,函数f(X)表示X所有约数的和。例如:f(6)=1+2+3+6=12。)
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll qq(ll n)
{
ll ans=0;
ll i, j;
for(i=1;i<=n;i=j+1)
{
j=n/(n/i);
ans+=(i+j)*(j-i+1)*(n/i);
}
return ans;
}
int main()
{
ll a, b;
while(scanf("%lld%lld", &a, &b)!=EOF)
printf("%lld\n",(qq(b)-qq(a-1))/2);
return 0;
}