列表

详情


NC201950. 草莓

描述

wls去农场采草莓。农场是一个 列的棋盘,其中第 行第 列的格子被称为
初始每个格子里都没有草莓。初始wls在格子 上。从第一天开始,每天早上每个格子里都会多出一个草莓。每天下午wls可以瞬移到上下左右四个相邻的格子中的一个(或者停留在当前的格子)。每天晚上wls自动收获他当前格子里的所有草莓。(收获后当前格子里的草莓清零。)wls的最后一次收获在第 天晚上。问wls最多能收获多少草莓。由于答案可能比较大(也不是很大),输出答案模 的余数。

输入描述

第一行一个正整数  代表数据组数()。
接下来 行每行一组数据。
每组数据包含五个正整数 )。

输出描述

每组数据输出一行,为答案模  的余数。

示例1

输入:

5
2 2 1 1 1
2 2 1 1 2
2 2 1 1 3
2 2 1 1 4
2 2 1 1 5

输出:

1
3
6
10
14

原站题解

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

C++14(g++5.4) 解法, 执行用时: 545ms, 内存消耗: 6388K, 提交时间: 2020-02-19 23:26:32

#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define inf 1000000000
#define Inf 223372036854775807
#define maxn 1001000
using namespace std;
typedef long long ll;
const ll mod=998244353;
const long double eps=1e-9;
const long double PI=acos(-1.0);

ll T, n, m, x, y, k, inv=499122177;

ll cal(ll l, ll r)
{
    l%=mod, r%=mod;
    return (l+r)*((r-l+mod+1)%mod)%mod*inv%mod;
}

int main()
{
    cin>>T;
    while (T--)
    {
        cin>>n>>m>>x>>y>>k;
        if (n>m) swap(n, m), swap(x, y);
        if (n>1)
        {
            if (k>=n*m) cout<<cal(k-n*m+1, k)<<"\n";
            else cout<<cal(1, k)<<"\n";
        }
        else
        {
            ll sho=max(min(y-1, m-y)-1, 0ll), len;
            if (k<=m-sho) len=k;
            else len=m-sho+(k-m+sho)/2;
            if (k>=sho+m) len=m;
            cout<<cal(k-len+1, k)<<"\n";
        }
    }
    return 0;

}

C++11(clang++ 3.9) 解法, 执行用时: 137ms, 内存消耗: 5784K, 提交时间: 2020-02-03 18:12:44

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
int inv2;
ll cal(ll l,ll r)
{
    l=max(l,0LL);
    l%=mod;r%=mod;
    return (l+r)*(r-l+1)%mod*inv2%mod;
}
int main()
{
    int T;
    scanf("%d",&T);
    inv2=(mod+1)/2;
    while (T--)
    {
        int n,m,x,y;
        ll k;
        scanf("%d%d%d%d%lld",&n,&m,&x,&y,&k);
        if (n<m) swap(n,m),swap(x,y);
        int mi=max(min(x-1,n-x),0);
        if (m>1 || k<=n-mi || k>=n+mi)
        {
            printf("%lld\n",cal(k-1LL*n*m+1,k));
            continue;
        }
        printf("%lld\n",cal((k-(n-mi))/2+1,k));
    }
    return 0;
}

上一题