简单数学(组合数+求数列通项公式)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6467

看到这题,简单数学???对不起我给数学老师丢脸了!

这里解释一下第二步到第三步:假设n=3,第二步{1*C(1,1)+1*C(1,2)+1*C(1,3)+2*C(2,2)+2*C(2,3)+3*C(3,3)},第三步{1*C(1,1)+1*C(1,2)+2*C(2,2)+1*C(1,3)+2*C(2,3)+3*C(3,3)}。可以发现是相等的

之后最后一步就是组合数求和公式2^n。

之后便可以得到递推公式。但是直接用递推公式写还是会超时的,所以要进一步化简成通项公式。

n*(2^(n-1))=2(n-1)*(2^(n-1))-(n-2)*(2^(n-1))

之后根据这个将其分配

F(n)-(n-1)*2^n=F(n-1)-(n-2)*(2^(n-1))

很明显就有等比数列:(F(n)-(n-1)*2^n)/(F(n-1)-(n-2)*(2^(n-1)))=1

并且这个等比数列的公比就是1

而F(1)=1,所以第一项值为1

所以很明显这个等比数列恒为1

所以F(n)-(n-1)*2^n=1 --->F(n)=(n-1)*(2^n)+1

既然有了通项公式,AC什么的都太简单了。

#include <bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
const ll mod=1e9+7;
void read(int &a)
{
    a=0;
    int d=1;
    char ch;
    while(ch=getchar(),ch<‘0‘||ch>‘9‘)
        if(ch==‘-‘)
            d=-1;
    a=ch-‘0‘;
    while(ch=getchar(),ch>=‘0‘&&ch<=‘9‘)
        a=a*10+ch-‘0‘;
    a*=d;
}
void write(int x)
{
    if(x<0)
        putchar(45),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+‘0‘);
}
ll quickmod(ll x,ll y)
{
    ll res=1;
    ll base=x;
    while(y)
    {
        if(y&1)
            res=res*base%mod;
        base=base*base%mod;
        y>>=1;
    }
    return res;
}
int main()
{
    ll n;
    while(~scanf("%lld",&n))
    {
        ll ans=((((n-1)%mod*quickmod(2,n))%mod)+1)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/acm1ruoji/p/10545116.html

时间: 2024-10-11 01:11:34

简单数学(组合数+求数列通项公式)的相关文章

求数列通项公式的小众方法

前言 以下的这些求数列的通项公式的方法都比较小众,不是主流的高考考查方法,在此只是作以整理: 不动点法 山东的一位老师提供,不动点法说明:[百度] 若\(f(x)=x\),则称\(x\)为方程的不动点: 令\(x=\cfrac{1}{2}(x+\cfrac{1}{x})\),则\(x^2=1\),解得\(x=\pm 1\)是\(f(x)=\cfrac{1}{2}(x+\cfrac{1}{x})\)的两个不动点: 例1已知数列\(\{a_n\}\)中,\(a_1=2\),\(a_{n+1}=\cf

一道使用Fibonnaci数列通项公式的趣味题目

一道使用Fibonnaci数列通项公式的趣味题目 求 \[ \sum_{i=0}^n{n\choose i}f_i \] 其中\(f_i\)表示Fibonnaci数列(\(f_0=0, f_1=1, f_n=f_{n-1}+f_{n-2}\))第n项. 内心:WTF.jpg 当时下面很多神仙都纷纷表达了自己的观点,什么矩阵快速幂.卷积... 结果老师讲正解,上来就用Fibonnaci数列通项公式. 内心:WTF.png Fibonnaci数列通项公式它长这样: \[ f_i=\frac{1}{\

轻院 2180GJJ的日常之沉迷数学 逆元求除法取余

题目链接:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2180 题目大意:求数列 k0,k1,k2...kn的和,即等比数列的前n项和对1e9+7取余的结果. 解题思路:等比数列前N项和为 ,因此只要能够取余即可求得结果.利用扩展GCD求q-1关于mod的逆元然后快速幂取模计算即可. 代码: 1 const int inf = 0x3f3f3f3f; 2 const int maxn = 1e6 + 5; 3 int k, n; 4 5 vo

编译器--简单数学表达式计算器

做了一个能够计算简单数学表达式值的小计算器,算不上是编译器,但用到了编译器的知识.最近在看一些编译器的东西,所以动手写这个最简单的计算器,既是对那些抽象的编译器知识有个形象的认识,也为后面添加复杂的东西--语句打下基础.此计算器是以<编译原理与实践>中实现的tiny编译器为参考写的,tiny是一个值得去研究的编译器,可以说是麻雀虽小,五脏俱全.从词法分析到代码生成都有,并且代码非常清晰易懂.我觉得想要了解编译器,可以从tiny入手,去将它跑起来并分析.废话不多说,开始记录这个小计算器. 先说下

HDU 1018 Big Number (简单数学)

Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25649    Accepted Submission(s): 11635 Problem Description In many applications very large integers numbers are required. Some of these

hdu 2200 Eddy&#39;s AC难题(简单数学。。)

题意: N个人,每个人AC的题数都不一样. Eddy想从中选出一部分人(或者全部)分成两组.必须满足第一组中的最小AC数大于第二组中的最大AC数. 问共有多少种不同的选择方案. 思路: 简单数学.. 代码: ll C(int n,int x){ ll ans=1; rep(i,1,x){ ans = ans*(n+1-i)/i; } return ans; } int main(){ int n; while(cin>>n){ ll ans = 0; rep(i,2,n){ ans += (C

组合数求模

适用于mod为素数 o(N) void init() { int i; pp[0] = 1; for(i = 1; i <= N-10 ; i++) { pp[i] = (pp[i-1]*i)%mod; } } LL fastmod(LL a,LL k) { LL b = 1; while(k) { if(k&1) b = a*b%mod; a = (a%mod)*(a%mod)%mod; k/=2; } return b; } LL calc(int n,int m) { return (

SDUT 2164-Binomial Coeffcients(组合数求模)

Binomial Coeffcients Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 输入 输出 示例输入 3 1 1 10 2 954 723 示例输出 1 45 3557658 提示 来源 山东省第二届ACM大学生程序设计竞赛 详情:组合数求模讲解 #include <stdio.h> #include <math.h> #include <string.h> #include <std

【机智题?】求数列中众数

求数列中众数 & 唯一出现为奇次数 前言: 我们的生活中经常有很多令人叫绝的优秀算法.他们往往既不冗长,也不笨拙. 蒟蒻的我能写暴力!虽然不是说不可以这么写算法,只是毕竟是算法竞赛,这样搭建的程序终究还是经不起考验的. 就如大算法(大?),让小算法组合成大算法,虽然有时不太容易能看出整体的效率,那我们为何不让每部分最优呢.(最优子结构?) 时间,空间, 我们不仅要能互换代价,还要让它们同时缩小! 正文: (-  . -) 嗯... 那个,啥,以上的前言等于啥都没说.不用管我就是了. 我们直接看题