2020hdoj多校赛第五场1001 1003 1009

题目链接1001 1003 1009
本文中逆元部分代码借鉴该博客。链接
解题思路:
一起打的同学做出来的,先贴在这,有空再细细学习。
1001思路大致就是几何推导知1/h^2=1/a^2+1/b^2+1/c^2,再求期望,为从1到n对其倒数方的求和除于n再乘3。
1001AC代码:

#include<iostream>
#include<cstdio>
using namespace std;
long long res[6000005];
long long mod=998244353;
void exgcd(long long a,long long b,long long &gcd,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        gcd=a;
    }
    else
    {
        exgcd(b,a%b,gcd,y,x);
        y-=x*(a/b);
    }
}
long long inv(long long a,long long mod)
{
    long long x,y,gcd;
    exgcd(a,mod,gcd,x,y);
    return gcd==1?(x%mod+mod)%mod:-1;
}
int main()
{
    long long T,n;
    for(int i=1;i<=6000005;i++)
    {
        long long j=i;
        res[i]=inv(j*j,mod);
    }
    for(int i=2;i<=6000005;i++)
    {
        res[i]=(res[i]+res[i-1])%mod;
    }
    for(int i=1;i<=6000005;i++)
    {
        res[i]=3*res[i]*inv(i,mod)%mod;
    }
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld",&n);

        printf("%lld\n",res[n]);
    }
    return 0;
}

1003和1009都是找规律。。。。。。

1003AC代码:

#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#include<stdlib.h>
using namespace std;
typedef long long ll;
long long mod=998244353;
struct number
{
    int d,x,y;
    bool operator <(const number q)
    {
        if(y==q.y)return x<q.x;
        return y<q.y;
    }
}p[1000005];
int main()
{
    int T,n,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=2*n*(1<<k);i++)
        {
            scanf("%d",&p[i].d);
            p[i].x=1;
            p[i].y=i;
        }
        for(int i=1;i<=k;i++)
        {
            for(int j=1;j<=2*n*(1<<k);j++)
            {
                if(p[j].y<=2*n*(1<<k)/(1<<i))
                {
                    p[j].x=1+(1<<(i-1))-p[j].x;
                    p[j].y=1+2*n*(1<<k)/(1<<i)-p[j].y;
                }
                else
                {
                    p[j].x+=1<<(i-1);
                    p[j].y-=2*n*(1<<k)/(1<<i);
                }
            }
        }sort(p+1,p+1+2*n*(1<<k));
        for(int i=1;i<=2*n*(1<<k);i++)
        {
            if(i==1)printf("%d",p[i].d);
            else printf(" %d",p[i].d);
        }printf("\n");
    }
    return 0;
}

1009AC代码:

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
//long long res[6000005];
long long mod=998244353;
ll qpow(ll m,ll q)
{
    ll ans=1;
    while(q)
    {
        if(q&1)
            ans=ans*m%mod;
        m=m*m%mod;
        q>>=1;
    }
    return ans;
}
//ll inv[6000005];
ll getinv(ll n)
{
    ll num3=qpow(n,mod-2);
    return num3;
}

int main()
{
    long long T,n;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld",&n);
        ll res=(qpow(2,n)%mod+1%mod+(2%mod)*qpow((3*getinv(2))%mod,n)%mod)%mod;
        printf("%lld\n",res);
    }
    return 0;
}
[ Copy to Clipboard ]    [ Save to File]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值