Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (4.17)

A 水题

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
int main()
{
    scanf("%d",&n);
    printf("%d",1+(n>>1));
    return 0;
}

B 水题

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,A,B,C,T,t[1005],ans;
//priority_queue<int> q;
int main()
{
    scanf("%d%d%d%d%d",&n,&A,&B,&C,&T);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&t[i]);
    }
    if(C>=B)
    {
        for(int i=0;i<n;i++)
        {
            ans+=(T-t[i])*(C-B);
            ans+=A;
        }
    }
    else
    {
        for(int i=0;i<n;i++)
        {
            ans+=A;
        }
    }
    printf("%d",ans);
    return 0;
}

C 逆元、等比数列
逆元用费马小定理求,这里要注意数据范围,k是不会很大的,但是 n+1k n + 1 k 可能会很大,所以暴力求会T。注意用等比数列通项公式优化,最坑的是 (ba)k1modM ( b a ) k ≡ 1 mod M 的情况,一定要分类讨论(一般过了好几个再WA就是特殊情况没有考虑吧)。
这题过的人很少,这个特殊情况当时是想到了的,不过后来又觉得可能是因为1e9+9不是素数,逆元改写成扩展欧几里得,时间就不够了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll qp(ll a, ll b, ll p)
{
    a%=p;
    ll res = 1;
    while(b)  
    {  
        if(b&1) res = (res*a)%p;  
        a = (a*a)%p;  
        b >>= 1;
    }
    return res;  
}
ll rev(ll a,ll n){  
    return qp(a,n-2,n); 
}
ll sigma[100005];
ll n,a,b;
ll k;
ll ans;
ll M=1000000009;
int s[100005];
int main()
{
    scanf("%lld%lld%lld%lld",&n,&a,&b,&k);
    getchar();
    ll q=((qp(b,k,M)*qp(rev(a,M),k,M))%M+M)%M;
    //ll q=qp(ba,k,M);
    if(q!=1)
        sigma[0]=(qp(a,n,M)*(1-qp(q,(n+1)/k,M))%M*rev(1-q,M))%M;
    else sigma[0]=(n+1)/k*qp(a,n,M)%M;
    for(int i=1;i<k;i++)
    {
        sigma[i]=((sigma[i-1]*b)%M*rev(a,M))%M;
    }
    for(int i=0;i<k;i++)
    {
        char tp;
        scanf("%c",&tp);
        if(tp=='+')ans=(ans+sigma[i])%M;
        else ans=(ans-sigma[i])%M;
    }
    if(ans<0)ans+=M;
    printf("%lld",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_viceversa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值