省赛-Fireworks

题目来源:第八届ACM山东省赛

题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3895.html

题目大意:在xi处有ci个烟火,每秒钟向前后位置分裂,问T秒后在w位置上有多少烟火

解题思路:由烟火爆炸的过程可以联想到杨辉三角(如下图),即以m秒每个位置的烟火数为第m行,从x位置爆炸到x-1和x+1的位置,可以对比为杨辉三角中每一行的数字等于上一行数字的左右两个数字之和。由杨辉三角的性质“第n行的m个数可表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数可以把题目转换为组合数问题。

附图:(以初始位置为中心)

0 0 0 0 0 1 0 0 0 0 0 (0s)

0 0 0 0 1 0 1 0 0 0 0 
0 0 0 1 0 2 0 1 0 0 0 
0 0 1 0 3 0 3 0 1 0 0 
0 1 0 4 0 6 0 4 0 1 0

(去掉0即为杨辉三角)

由于组合数较大,我们可以用求逆元的方式求组合数。组合数的计算方法为C(n,m)=n!/(m!*(n-m)!)。我们记a的逆元为inv(a)。

求逆元的方法:

inv(a)=a^(p-2)%p;

组合数与逆元之间的关系:

(a/b)%p=[a*inv(a)]%p=[a%p*inv(b)%p]%p;

a/bc=(a/b)/c=[(a/b)*inv(c)]%p={[(a%p*inv(b)%p)%p]*inv(c)%p}%p;

算法实现:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

typedef long long ll;
const ll mod=1e9+7;
const int maxn=1e5;

ll abc[101010]; //与初始点距离有关的一个数组
ll fac[101010];

void init() //求阶乘
{
    fac[0]=1;
    for(int i=1; i<=maxn; i++)
    {
        fac[i]=fac[i-1]*i;
        fac[i]=fac[i]%mod;
    }
}

ll quickM(ll a, ll b) //快速幂
{
    ll c=a%mod, ans=1;
    while(b)
    {
        if(b&1) //b的二进制与上1
            ans=ans*c%mod;
        c=c*c%mod;
        b=b>>1;
    }
    return ans;
}

ll C(int n, int m) //用逆元法求组合数
{
    return (fac[n]*quickM(fac[m], mod-2)%mod*quickM(fac[n-m],mod-2)%mod)%mod;
} //inv(a)=quickM(a,mod-2)%mod

int main()
{
    int n,T,w,xi,ci;
    init();
    while(cin>>n>>T>>w)
    {
        memset(abc,0,sizeof(abc));
        for(int i=T,k=T; i>=0; i=i-2,k--)
            abc[i]=C(T,k); //i为距初始点位置,abc[i]为每个烟火的所求值
        ll ans=0;
        for(int i=1; i<=n; i++)
        {
            cin>>xi>>ci;
            ans=ans+ci*abc[(int)abs(w-xi)];
            ans=ans%mod;
        }
        cout<<ans<<endl;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fireworks是Adobe公司开发的一款图像编辑和设计软件,它具有许多高级的特性和功能,适用于网页和移动应用的设计。在正式使用Fireworks之前,确保您的计算机已经安装了Adobe Creative Suite软件套件,其中包括Fireworks。然而,Fireworks也有一些适用于Windows和Mac操作系统的免安装版本。 Fireworks CS6 Portable是Fireworks的一个免安装版,它旨在提供一个便携式的解决方案,您可以随时随地使用它,而无需进行繁琐的安装程序。只需下载和解压缩Portable软件包,您就可以开始使用Fireworks CS6,而无需花费额外的时间和精力来安装该软件。 Fireworks CS6 Portable具有与安装版本相同的功能和界面。您可以使用该软件创建和编辑矢量图形、位图图像、界面设计和动画。此外,您还可以使用其广泛的图像优化和调整选项,以及其方便的批处理功能进行高效的图像处理。 不过,需要注意的是,由于Fireworks CS6 Portable并非官方版,在使用过程中可能会遇到一些问题或限制。例如,因为它是一个便携式版本,所以无法获得官方的技术支持,也不能获得官方的更新和修复。 总结而言,Fireworks CS6 Portable是一款方便的免安装版本,可以为用户提供Fireworks的大部分功能和特性,让用户节省时间和精力。如果您只是偶尔需要使用Fireworks,或者短期内无法安装官方版本,那么Fireworks CS6 Portable可能是您的一个选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值