问题 A: 组合数
题目描述
求组合数C(N,M),以及C(N,M)因子个数。
输入
N和M,其中0<=M<=N<=50,以EOF结束。
输出
该组合数结果
样例输入 Copy
3 2 4 2
样例输出 Copy
3 2 6 4
思路: 1.C(N,M) (0<=M<=N<=50)可以选择打表
2.由于数据较大,普通的求因子个数算法肯定超时,这时可以考虑质因子分解算法求因子个数
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int Max=60;
typedef long long LL;
LL C[Max][Max];
void Init()
{
for(int i=0;i<=50;i++)
{
C[0][i]=0;
C[i][0]=1;
}
for(int i=1;i<=50;i++)
{
for(int c=1;c<=50;c++)
{
C[i][c]=C[i-1][c]+C[i-1][c-1];
}
}
return ;
}
int factor(LL x)
{
int n=1;
for(LL i=2;i<=x;i++)
{
if(x%i==0)
{
int c=0;
while(x%i==0)
{
x/=i;
c+=1;
}
n*=(1+c);
}
if(x<i) break;
}
return n;
}
int main()
{
int N,M;
Init();
while(~scanf("%d %d",&N,&M))
{
printf("%lld %d\n",C[N][M],factor(C[N][M]));
}
return 0;
}
问题 C: 序列交换
题目描述
给一个 1 到 n 的排列,每次可以交换相邻两个数,问使用最少操作次数使得序列递增的方案是否唯一。
输入
多组输入,每组一个数n(1<=n<=10^5),然后是一个1~n的排列。
输出
方案唯一输出Yes,否则输出No。
样例输入