2020杭电多校第六场

1001.Road To The 3rd Building

前缀和快数幂

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sc(a) scanf("%d",&a)
#define pf printf
const int N=2e5+10;
ll mod=1e9+7;
ll n,t;
ll a[N],b[N];
ll s[N];
ll sum[N];
ll ss[N];
ll p[N];
ll ny(ll x)
{
    ll ans=1,n=mod-2;
    x%=mod;
    while(n)
    {
        if(n%2==1)
            ans*=x,ans%=mod;
        x*=x;
        x%=mod;
        n/=2;
    }
    return ans;
}
int main()
{
    cin>>t;
    p[1]=1;
    for(int i=2;i<=N-10;i++)
    {
        p[i]=p[i-1]*i;
        p[i]%=mod;
    }
    b[1]=1;
    for(int i=2;i<=N-10;i++)
        b[i]=b[mod%i]*(mod-mod/i)%mod;
    while(t--)
    {
        scanf("%lld",&n);
        s[0]=0;
        sum[0]=0;
        ss[n+1]=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            s[i]=a[i]+s[i-1];
            s[i]%=mod;
            sum[i]=sum[i-1]+i*a[i]%mod;
            sum[i]%=mod;
        }
        for(int i=n;i>=1;i--)
        {
            ss[i]=ss[i+1]+a[i]*(n-i+1)%mod;
            ss[i]%=mod;
        }
        ll ans=0;ll m=0;
        for(int i=1;i<=ceil(n*1.0/2);i++)
        {

            //ans+
            m=(s[n-i+1]-s[i-1])*i;
            //ans%=mod;
            m+=sum[i-1]+ss[n-i+2];
            m%=mod;
            m*=p[n];
            m%=mod;
            m*=b[i];
            m%=mod;
            ans+=m;
            ans%=mod;
        }
        for(int i=ceil(n*1.0/2)+1;i<=n;i++)
        {
            m=(s[i]-s[n-i])*(n-i+1);
            m%=mod;
            m+=sum[n-i]+ss[i+1];
            m%=mod;
            m*=p[n];
            m%=mod;
            m*=b[i];
            m%=mod;
            ans+=m;
            ans%=mod;
        }
        ll k=n*(n+1);
        k%=mod;
        k*=b[2];
        k%=mod;
        k*=p[n];
        k%=mod;
        ans*=ny(k);
        ans%=mod;
        cout<<ans<<'\n';

    }
    return 0;
}

1002.Little Rabbit's Equation

模拟

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define sc(a) scanf("%d",&a)
#define pf printf
const int N=1e6+10;
int n;
char a[100];
int s[N];
int main()
{
    while(~scanf("%s",a+1))
    {
        n=strlen(a+1);
        int mx=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>='0'&&a[i]<='9'){
                mx=max(mx,a[i]-'0');
                s[i]=a[i]-'0';
            }
            else if(a[i]>='A'&&a[i]<='F'){
                int x=a[i]-'A'+10;
                mx=max(mx,x);
                s[i]=x;
            }
        }
        int f=0,k;char op;
        for(int j=1;j<=n;j++)
        {
            if((a[j]>='0'&&a[j]<='9')||(a[j]>='A'&&a[j]<='F'));
            else {
                k=j;op=a[j];break;
            }
        }
        int kk;
        for(int j=k+1;j<=n;j++)
        {
            if((a[j]>='0'&&a[j]<='9')||(a[j]>='A'&&a[j]<='F'));
            else {
                kk=j;break;
            }
        }
        for(int i=max(mx+1,2);i<=16;i++)
        {
            ll x=0,y=0,z=0;
            ll d=1;
            for(int j=k-1;j>=1;j--)
            {
                x+=s[j]*d;
                d*=i;
            }
            d=1;
            for(int j=kk-1;j>=k+1;j--)
            {
                y+=s[j]*d;
                d*=i;
            }
            d=1;
            for(int j=n;j>=kk+1;j--)
            {
                z+=s[j]*d;
                d*=i;
            }
            if(op=='+'){
                if(x+y==z){
                    f=i;
                    break;
                }
            }
            else if(op=='-'){
                if(x-y==z){
                    f=i;
                    break;
                }
            }
            else if(op=='*'){
                if(x==0){
                    if(z==0){
                        f=i;break;
                    }
                    else continue;
                }
                if(z/x==y&&z%x==0){
                    f=i;break;
                }
            }
            else {
                if(x%y==0&&x/y==z){
                    f=i;break;
                }
            }
        }
        if(f==0)f=-1;
        pf("%d\n",f);
    }
    return 0;
} 

1009.Divisibility

签到

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int mod=998244353;
const int maxn=5e5+10;
ll s;
int main()
{
    int t;
    ll b,x;
    cin>>t;
    while(t--)
    {
        scanf("%lld %lld",&b,&x);
        if(x>=b)
            printf("F\n");
        else if((b+x-1)%x==0)
            printf("T\n");
        else
            printf("F\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值