主题: https://www.Luo gu.org/problem new/show/p 2822
解决问题的想法:
因为组合数有可能变大,所以对k取模型。 如果类型为0,则为k的倍数。 组合数实际上是杨辉三角。 (c[i][j]=c[i-1][j] c[i-1][j-1]。 这两种计算方法都是这个公式)
数组c[i][j]即c[I,j],ans[i][j]保存回答,先打上表
方法1:
ans [ I ] [ j ]=ans [ I-1 ] [ j ]-ans [ I-1 ] [ j-1 ] ans [ I ] [ j-1 ];
if (! c[I][j]j=I]ans[I][j];
注意:此时,I、j都从1~maxn开始遍历。 求出ans[i][j]时,与前一行对应的ans[i-1][j]不能为0。 否则,-a[i-1][j-1]将是负数,因为结果可能是错误的
方法2:
请勿仅基于输入的n的最大值创建表,而创建大小为maxn*maxn的表
if (! c[i][j] )
ans[i][j]=ans[i-1][j] 1;
else ans[i][j]=ans[i-1][j];
组合数数组c[][]的存储有两种方法。 只是控制输出的条件不同。 试了很久,才知道区别在哪里。 太弱了I和j都从1开始存,实际上存杨辉三角,第一排都是c(I,0 )
I和j都从1开始存储,不存储杨辉三角的第1列,此时的第1列都是c(I,1 )
交流电源线:
方法1
# include # include # include # include # include # include # include # include # include #
用户命名空间STD;
int t,k,n,m; //n=m
long long c[maxn][maxn]={0},ans[maxn][maxn]={0}; //求组合数的数组和答案的数组
void pre_solve (
{
c[0][0]=1;
for(intI=1; i=maxn; I )
c[i][i]=c[i][0]=1;
for(intI=1; I
方法2:
I和j从1开始存款,实际存了杨辉三角
# include # include # include # include # include # include # include # include # include #
用户命名空间STD;
int t,k,n,m; //n=m
long long c[maxn][maxn]={0},ans[maxn][maxn]={0}; //求组合数的数组和答案的数组
int maxnn=0,maxm=0;
结构节点{
int n,m;
}a[10001];
int main () )
{
//Freopen ()/users/zhangkanqi/desktop/11.txt '、' r '、stdin );
扫描(' % d % d )、t、k );
for(intI=0; I
I和j从1开始保存,杨辉三角的第一列不保存
# include # include # include # include # include # include # include # include # include #
用户命名空间STD;
int t,k,n,m; //n=m
long long c[maxn][maxn]={0},ans[maxn][maxn]={0}; //求组合数的数组和答案的数组
int maxnn=0,maxm=0;
结构节点{
int n,m;
}a[10001];
int main () )
{
freopen ()/users/zhangkanqi/desktop/11.txt )、(r )、stdin );
扫描(' % d % d )、t、k );
for(intI=0; I