Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
容斥定理。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
long long gcd (long long a, long long b)
{
return b ? gcd (b, a % b) : a;
}
long long c (long long n, long long m)
{
long long a = 1, b = 1, g;
if (n - m < m)
m = n - m;
while (m) {
a *= n--;
b *= m--;
g = gcd (a, b);
a /= g;
b /= g;
}
return a / b;
}
long long fac [21];
void init_fac ()
{
int i;
*fac = 1;
for (i=1; i<=20; ++i)
fac [i] = i * fac [i - 1];
#ifdef _DEBUG
for (i=0; i<=20; ++i)
printf ("%20lld", fac [i]);
printf ("\n");
#endif
}
long long p [21];
void init_p ()
{
long long i;
*p = 1;
for (i=1; i<=20; ++i)
p [i] = -1 * p [i - 1];
}
int main ()
{
long long n, m, ans;
init_fac ();
init_p ();
#ifdef ONLINE_JUDGE
while (scanf ("%I64d", &n) == 1) {
#else
while (scanf ("%lld", &n) == 1) {
#endif
ans = 0;
m = n;
while (m >= 0) {
ans += p [m] * c (n, m) * fac [n - m];
--m;
}
#ifdef ONLINE_JUDGE
printf ("%I64d\n", ans);
#else
printf ("%lld\n", ans);
#endif
}
return 0;
}