和杭电2048用了类似的方法(博客里有)并在此基础上加入了对组合数的用法
组合数指的是从 n 个不同元素中取出 m 个元素的组合数,表示为 C(n,m) 或 n choose m。它的计算公式为:
C(n,m) = n! / [m! * (n-m)!]
- #include
-
- void main()
- {
- int c,n, m, i, j;
- long long nums[21]={0,0,1}, sn, sm;
- for (i = 3; i <= 20; i++)
- nums[i] = (i - 1) * (nums[i - 1] + nums[i - 2]);
- while (~scanf_s("%d", &c))
- {
- while(c--)
- {
- scanf_s("%d%d", &n, &m);
- sn = sm = 1;
- for (i = n - m + 1; i <= n; i++)
- sn *= i;
- for (j = 2; j <= m; j++)
- sm *= j;
- printf("%lld\n", sn / sm * nums[m]);
- }
- }
- }