2019 ICPC Asia Yinchuan Regional 训练记录

vjudge地址 2019 ICPC Asia Yinchuan Regional

B    

题意:给一个 n*n的矩阵,初始为0,进行若干次操作,每次操作可以使得矩阵的一行或一列的每一个元素加上一个正整数。现在给出操作后得到的矩阵,但是其中有一个元素未知(以-1标记),求出这个元素的值。

思路:先对与-1元素无关的行与列做处理,即将这些行或列的所有元素减去他们的最小值。

检查-1所在行与列除-1外的其他值,分别取除-1的最小值,再将两者加起来即可。

F    

题意:

G    

题意:定义

给出n,求 ,答案对998244353取模。

 思路:可知fa-1(x)=loga(x),因为b>=a>=2,所以fb-1(a)的上取整必为1。

考虑前一项loga(b)下取整,对于a2>b,该项为1;对于a3>b,该项为2......

然后枚举a,就可以根据ai>b(i>2),得到对答案的贡献(min(n+1,ai)-ai-1)*i

对于a2>b的情况,对答案贡献为∑i(n+1-i) - (n+∑(ai>b部分的i(n+1-i)) ),

前一项∑i(n+1-i)拆解得(n+1)∑i-∑i2,即(n+1)2n/2-n(n+1)(2n+1)/6

求就完事了。(取模会有点麻烦)具体见代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll now,ans,res;
const int mod=998244353;
ll pow(ll x,ll k)
{
    ll re=1;
    while (k)
    {
        if (k&1) re=re*x%mod;
        x=x*x%mod;
        k>>=1;
    }
    return re;
}
int main()
{
    ll i,j,n,x;
    ll res,re,ans;
    scanf("%lld",&n);
    ans=0;
    for (i=2;i<=n;i++)
    {
        now=0;
        for (j=0,x=i;x<=n;j++,x=x*i) now=(now+(min(n+1,x*i)-x)*j%mod)%mod;
        if (j==1) break;
        else ans=(ans+now*i%mod)%mod;
    }
    n=n%mod;
    res=(n+1)*n/2%mod*(n+1)%mod;
    re=n*(n+1)/2%mod*(2*n%mod+1)%mod*pow(3,mod-2)%mod;
    res=(res-re+mod)%mod;
    res=(res-n+mod)%mod;
    ans=(ans+res)%mod;
    printf("%lld\n",ans);
    return 0;
}
View Code

I

进制转换,x进制转为y进制(2<=x,y<=62)。

可以用Java做,先将x进制转为10进制再转为y进制。

N

直接输出就行了。。    

posted @ 2020-10-03 16:11  lsy_kk  阅读(173)  评论(0编辑  收藏  举报