列表

详情


NC204088. 病毒扩散

描述

牛牛所在的城市有一种新型病毒开始扩散。在一个二维平面坐标系上,有一个感染者在 的位置。从 时刻 开始,每一个在 的感染者都会让下一个时刻 的感染者数量增加



上图展示了时刻    和时刻    病毒的扩散情况。在时刻 的感染者数量为 。在时刻 的感染者数量为 的感染者数量为

牛牛想知道,对于特殊的 个点,在时刻 感染者的数量。

输入描述

第一行一个正整数,表示特殊点的数量。

接下来 行,每行三个非负整数 x_i,y_i,t_i,表示有一个特殊的点在 (x_i,y_i),牛牛想知道在时刻 t_i 这个点有多少感染者。

输出描述

对于每一个特殊的点,输出一行一个非负整数,表示在  时刻这个点的感染者数量,对 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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 180ms, 内存消耗: 69580K, 提交时间: 2020-04-25 14:22:27

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,N=5e3;
typedef long long ll;
int c[N+5][N+5];
void fun(){
	for(int i=0;i<=N;i++) c[i][0]=c[i][i]=1;
	for(int i=2;i<=N;i++)
		for(int j=1;j<i;j++)
			c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
	}
int main(){
	fun();
	int n;
	scanf("%d",&n);
	while(n--){
		int x,y,t;
		scanf("%d%d%d",&x,&y,&t); 
		printf("%lld\n",(ll)c[t][x+y]*c[x+y][x]%mod);
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 302ms, 内存消耗: 69408K, 提交时间: 2020-05-07 11:48:58

#include<iostream>
using namespace std;
const int M=998244353,N=5e3;
#define ll long long
int c[N+5][N+5],n,x,y,t;
int main()
{
	for(int i=0;i<=N;i++)
	c[i][0]=c[i][i]=1;
	for(int i=2;i<=N;i++)
	for(int j=1;j<i;j++)
	c[i][j]=(c[i-1][j-1]+c[i-1][j])%M;
	cin>>n;
	while(n--)
	{
		cin>>x>>y>>t;
		cout<<((ll)c[t][x+y]*c[x+y][x]%M)<<endl;
	}
}

上一题