首页 > 其他分享 >计算系数(acwing,数论)

计算系数(acwing,数论)

时间:2024-04-09 22:58:30浏览次数:32  
标签:系数 数论 int 苹果 Cp MOD 我们 acwing

题目描述:

给定一个多项式 (ax+by)^k,请求出多项式展开后 x^n*y^m 项的系数。

输入格式:

共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。

输出格式:

输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 10007取模后的结果。

数据范围:

0≤n,m≤k≤1000,
n+m=k,
0≤a,b≤1e6;

输入样例:

1 1 3 1 2 

输出样例:

3

分析步骤:

  第一:理清思路:

  1. 通过看题目,我们清楚是要我们求解组合数的系数。所以如果我们要求解x^n*y^m的系数,系数就应该是Ck^n * a^n * b^m。那么这个Ck^n应该怎么求呢?这么多数如果我们一个一个硬算的话我们一定很困难和很耗时间的。

  2. 但是我们学过组合数的递推公式就是Cp^j = Cp-1^j-1+Cp-1^j。怎么理解这个公式呢?我们可以想:现在我从一堆苹果里面随便挑出了一个苹果,题目要求我们选择j个苹果,那么现在就分为两种情况一种是包含这个我们挑中的苹果,那么我们现在只要从p-1个总数中挑出j-1个苹果就可以了所以就是Cp-1^j-1;一种是不包含这个苹果,那么我们要从p-1个苹果中挑出j个苹果。只有这两种情况那么这两种情况加到一起就可以包括了所有的可能。那么只要递推过来就可以知道后面的情况了。

  第二:书写主函数,构建整体框架:

  1. 我们把值全部都输入进去,这里有一个值得注意的地方这个点很细小,就是我们的a,b必须要先求一次模,为什么呢?因为我们的a和b最大都是1e6,如果最后和模相乘一下的话就会是1e10级别的数,那么一定会溢出。所以这里一定要模一下,不然过不去!

  2. 这里进入两层for循环利用好我们的递推公式,我们判断一下如果j是0的情况,就相当于从i个苹果里面选择0个的方案数,很明显一个都不选就是一种方案所以方案数就是1。

  3. 最终我们得出来的答案就是res[k][n](Ck^n)个方案。

  4. 我们已经把组合数的系数值算出来了,接下来就以要计算a和b的次方就行了

int main()
{
    cin>>a>>b>>k>>n>>m;
    a %= MOD , b %= MOD;
    for(int i = 0 ; i <= k ; i ++){
        for(int j = 0 ; j <= i ; j ++){
            if(!j) res[i][j] = 1;
            else res[i][j] = (res[i-1][j-1]+res[i-1][j])%MOD;
        }
    }
    int ans = res[k][n];
    for(int i = 0 ; i < n ; i ++) ans = ans * a % MOD;
    for(int i = 0 ; i < m ; i ++) ans = ans *b % MOD;
    cout<<ans;
    
    
    return 0;
}

代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1100 , MOD = 10007;

int a,b,k,n,m;
int res[N][N] ;

int main()
{
    cin>>a>>b>>k>>n>>m;
    a %= MOD , b %= MOD;
    for(int i = 0 ; i <= k ; i ++){
        for(int j = 0 ; j <= i ; j ++){
            if(!j) res[i][j] = 1;
            else res[i][j] = (res[i-1][j-1]+res[i-1][j])%MOD;
        }
    }
    int ans = res[k][n];
    for(int i = 0 ; i < n ; i ++) ans = ans * a % MOD;
    for(int i = 0 ; i < m ; i ++) ans = ans *b % MOD;
    cout<<ans;
    
    
    return 0;
}

标签:系数,数论,int,苹果,Cp,MOD,我们,acwing
From: https://blog.csdn.net/2302_76987120/article/details/137568732

相关文章

  • 蓝桥杯之初等数论
    在蓝桥杯竞赛中,初等数论部分涉及多个关键知识点。以下是对这些知识点的详细列出、基本概念解释、应用实例以及解题策略和步骤的说明:1.质数与合数基本概念:质数(素数):大于1的自然数中,只能被1和它本身整除的数。合数:除了1和它本身以外还有其他因数的自然数。应用实例:题目:......
  • 二十八 211. 计算系数 (组合计数|逆元)
    211.计算系数(组合计数|逆元)数论之快速幂、扩欧算法、同余与逆元组合计数importjava.util.*;publicclassMain{privatestaticfinalintmod=10007;privatestaticint[][]C=newint[1010][1010];publicstaticvoidmain(String[]args)......
  • 数论进阶
    数论基础知识常函数\[1(n)=1\]\[2(n)=2\]\[\dots\]欧拉函数\[\varphi(n)=\sum_{i=1}^n[gcd(i,n)=1]\]莫比乌斯函数\[\mu(n)=\begin{cases}1,n=1\\0,\existsd,x=d^2\\(-1)^k\(n=p_1^{c_1}p_2^{c_2}\cdotsp_k^{c_k}),otherwise\end{cases}\]黎曼函数\[\zeta(......
  • [数论] 判断一个多位数是不是x的倍数
    (n最多10000位)3<=x<=9;判断3:判断一个数是否是3的倍数,原理是将这个数的各个位上的数加起来,其和是3的倍数的话,那这个数便是3的倍数。判断4:判断一个数是否是4的倍数的方法:看这个数的末两位上的数是否是4的倍数。因为满百位的肯定是4的整数倍,100可以整除4判断5:判断一个......
  • Acwing 681. 疏散人群(dfs)(记录根节点下有几个子节点)
    输入样例:62132435261输出样例:4#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLN=100200,M=2020;constLLmod=998244353;vector<LL>g[N];LLsum[N];LLdfs(LLidx,LLfa){LL......
  • 【学习笔记】数论分块
    先看一个例子:给出正整数\(n(n\leq10^{12})\),计算:\[\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\]如果直接暴力,复杂度为\(O(n)\),无法在1s内通过,但使用数论分块(整除分块)可以将复杂度降至\(O(\sqrt{n})\)。先看个例子,当\(n=100\)时,\(i\)和\(\lfloor\frac{n}{i}\r......
  • 数论
    前言本篇文章主要是给未来的自己看的。由于证明不想直接给导致丧失思考能力,所以没写。还没写完qwq~。知识点余数与质数:质数筛法,欧拉函数,欧几里得(ex),斐蜀定理,BSGS,同余的性质,逆元。组合与矩阵:矩阵乘法,矩阵加速,高斯消元,组合数学,容斥原理............详解质数筛法埃筛:找到质数......
  • Acwing2024蓝桥杯递归
    模板:欧几里得算法//若a,b互质则返回1,否则返回0intgcd(inta,intb){returnb?gcd(b,a%b):a;}题目:AcWing1360.有序分数暴力模拟法(AC):#include<iostream>#include<algorithm>#definexfirst#defineysecondusingnamespacestd;intn;typed......
  • ACwing830 单调栈
    这道题是P8600[蓝桥杯2013省B]连号区间数的前置知识#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespa......
  • 【算法】数论
    题目链接前言疑似是有点不会数学了,照着题解推式子都推了小半个下午,还看不出来减法公式,唉。题解考虑把这些\(f(a,b)\)异或起来再模一个数不会有很好的性质,所以要把每一个\(f(a,b)\)都算出来。由加法公式得\[f(a,b)=\sum\\tbinom{b}{i}\tbinom{n-i}{a}\]\[=\sum\tbin......