病毒扩散

病毒扩散

https://ac.nowcoder.com/acm/contest/5205/B

链接:

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述
在这里插入图片描述
牛牛想知道,对于特殊的 \ n n 个点,在时刻\ t t 感染者的数量。
输入描述:
在这里插入图片描述

输出描述:
对于每一个特殊的点,输出一行一个非负整数,表示在 \ t t 时刻这个点的感染者数量,对 998244353 取模。
示例1
输入
复制
3
0 0 1
1 1 2
2 0 2
输出
复制
1
2
1
说明
见题目描述中的图片。
示例2
输入
复制
5
5 5 7
2 7 9
0 14 14
0 14 15
14 29 100
输出
复制
0
36
1
15
891148910
备注:
在这里插入图片描述
题解:
我们可以转化下题意:

从(0,0)出发,每次可以走一步,或者原地不动,问t时刻走到(x,y)的方案数量

想想这个怎么做?不会
因为一次最多走一步,所以到(x,y)至少要走x+y个时刻,
我们设sum=x+y,sum一定要大于t否则怎么能走到,要在t时刻内走到,就是在t内选sum个时刻,共有C^t^sum
在移动的sum个步数里,有x步需要x坐标加一,其余要将y坐标加一,一共有C^x^sum
综上,乘在一起就可以

还一个想法:一共t时刻,其中选出x个用于x坐标加一,剩下t-x中选出y个用于y坐标加一,剩下的原地不动
这样就是C^x^t*C^y^t-x
求组合数时,
乘法逆元:(a/b)% mod = a * b^(mod-2),mod为素数
代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
const int mod = 998244353;
ll poww(ll a, ll b)
{
    ll ans = 1;
    a = a % mod;
    while (b)
    {
        if(b & 1) ans = (ans* a) % mod;
        a = ( a*a )% mod;
        b = b >> 1;
    }
    return ans;
}

ll c[maxn];
int main()
{
     int n;
     ll c1,c2;
    c[1]=1,c[0]=1;
    for( ll i=2;i<maxn;i++ ) c[i]=(c[i-1]*i)%mod;

    scanf("%d",&n);
    while( n-- )
    {
        int a,b,t;
        scanf("%d%d%d",&a,&b,&t);
        if( a+b>t )
        {
            cout<<"0"<<endl;
            continue;
        }
         c1=( c[t] * poww( c[t-b] * c[b], mod - 2) ) % mod;
         c2=( c[t-b] * poww( c[t-b-a] * c[a], mod - 2) ) % mod;
        printf("%lld\n",(c1*c2)%mod);
    }
    return 0;
}

我看还有一个是找规律,用杨辉三角形做的,tql

全部评论

相关推荐

会飞的猿:我看你想进大厂,我给你总结一下学习路线吧,java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding,我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行,什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。项目的话其实说白了还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。另外,只想找个小厂的工作的话,没必要全都照这些准备,太累了,重点放在框架的使用和一些基础八股吧。大致路线就这样,没啥太多难度,就是量大,你能达到什么高度取决于你对自己多狠,祝好。
点赞 评论 收藏
分享
优秀的肱二头肌不想上班:改改简历吧,简历太简单了
点赞 评论 收藏
分享
03-15 20:26
已编辑
电子科技大学 C++
T3题面:给一个3e5数组,每次询问长度为len的子数组乘积的和,如果子数组乘积&gt;1e9,则视为0.赛后一分钟想出来了,比赛时打了个暴力+线段树注意到1e9大约是2^30,&nbsp;因此len长度如果&gt;30就直接输出0,30以内做一个记忆化就行,复杂度O(30*n)感觉是以前比赛做过的题,忘了怎么做了。。。---upd:&nbsp;忘了数据范围了,如果有0,1的话那这样也不行
blueswiller:给出一个做法,刚刚才想到,应该没问题,时间复杂度为 O(max(30n, nlogn)): 1. 根据 0 切分数组。2. 现在问题转化为>=1 的情况,我们首先维护每一个数前一个 > 1 的数的位置,同时维护一个长度的差分数组,初始值全为 0。3. 我们从每一个数 i 开始向前跳,至多跳 30 次,维护这个过程中的乘积,于是得到 30 个区间加和。举例:假设从 j1 跳到 j2 ,相当于对查询长度 (i- j1 + 1) 至 (i - j2) 贡献 a_i * ... * a_j1。4. 对于所有区间加和,我们采用差分数组结合树状数组对其进行维护,由于长度至多为 n ,树状数组构建的复杂度为 O(nlogn),于是,构建阶段的复杂度为 O(max(30n, nlogn))。在线单次查询的复杂度为树状数组查询的复杂度 O(logn)。
投递淘天集团等公司10个岗位 > 笔试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务