[2020杭电多校]第一场

  • 1004-构造
  • 1005-数学乱搞-费马小定理降幂-卡常
  • 1009-思维题

    1004 Distinct Sub-palindromes

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6754
    签到构造题qwq
    n>3的话构造abcabcabc……的序列即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define N 100100
    #define MOD 1000000007

    using namespace std;

    int m,n;

    int main()
    {
    int i,j,t;
    int ans;
    scanf("%d",&t);
    while(t--)
    {
    scanf("%d",&n);
    if(n==1)
    ans=26;
    else if(n==2)
    ans=676;
    else if(n==3)
    ans=26*26*26;
    else
    ans=25*24*26;
    printf("%d\n",ans);
    }

    return 0;
    }

    1005 Fibonacci Sum

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6755

    题意:

    $F_n$为斐波那契序列已知N,C,K,求:输入T组样立,分别输入N,C,K,输出上式模1e9+9
    数据范围:$1≤T≤200,1≤N,C≤10^{18},1≤K≤10^5$

    输入

    2
    5 1 1
    2 1 2

    输出

    12
    2

    思路

    数据大,考虑斐波那契通项公式于是有然后用等比数列通项求一下就行,注意考虑公比为0的情况QAQ。。。。
    可以用O(k)的复杂度进行计算
    再处理根号五的问题。由于答案模1e9+9,想到二次剩余
    $x^2\equiv5(mod 1e9+9)$
    解出来x为383008016
    然后这题还要用费马小定理降幂,降低时间复杂度QAQ
    c%=(mod-1);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <bits/stdc++.h>
    #pragma GCC optimize(3,"Ofast","inline")

    using namespace std;
    typedef long long ll;
    const ll qaq=383008016;
    const ll mod=1e9+9;
    ll ai[100005],bi[100005];
    ll Fact[100005],INV[100005];

    inline ll ksm(ll a,ll k){
    ll ans=1;
    while(k){
    if(k&1ll) ans=ans*a%mod;
    a=a*a%mod;
    k>>=1ll;
    }
    return ans%mod;
    }

    inline ll inv(ll a){
    return ksm(a,mod-2);
    }

    inline void init(ll n){
    Fact[1]=1;Fact[0]=1;
    for(ll i=2;i<=n;++i) Fact[i]=Fact[i-1]*i%mod;
    INV[n]=ksm(Fact[n],mod-2);
    for(ll i=n-1;i>=0;--i) INV[i]=INV[i+1]*(i+1)%mod;
    }


    int main(){
    init(100001);
    ll t;scanf("%lld",&t);
    ll a=(1+qaq)*inv(2)%mod;
    ll b=((1-qaq)+mod)*inv(2)%mod;
    ai[0]=1,bi[0]=1;
    for(int i=1;i<=100000;i++) ai[i]=ai[i-1]*a,ai[i]%=mod;
    for(int i=1;i<=100000;i++) bi[i]=bi[i-1]*b,bi[i]%=mod;
    ll qaqaq=inv(qaq);
    ll op;
    while(t--){
    ll n,c,k;scanf("%lld%lld%lld",&n,&c,&k);
    c%=(mod-1);
    ll ans=0;
    if(k&1ll) op=-1;
    else op=1;
    for(ll i=0;i<=k;i++){
    ll temp=(ai[i]*bi[k-i])%mod;
    ll tempp=ksm(temp,c);
    temp=(tempp*(ksm(tempp,n)-1))%mod;
    temp*=inv(tempp-1);
    temp%=mod;
    if(tempp==1) temp=n%mod;
    temp=temp*Fact[k]%mod*INV[i]%mod*INV[k-i]%mod;
    ans=ans+temp*op+mod;
    ans%=mod;
    op*=-1;
    }
    ans*=ksm(qaqaq,k);
    ans=ans%mod;
    printf("%lld\n",ans);
    }
    return 0;
    }

    1009 Leading Robots

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6759
    嫖份队友代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct node
    {
    long long int p,a;
    }ro[500005];


    struct stac{
    long long int p;
    long long int a;
    bool flag;//可不可能成为第一名
    }sta[500005];

    bool cmp(node a,node b){
    if(a.p==b.p) return a.a>b.a;
    else return a.p>b.p;
    }
    int ans[500005];
    int main(){
    int t;
    scanf("%d",&t);
    while(t--){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
    scanf("%lld%lld",&ro[i].p,&ro[i].a);
    }
    sort(ro,ro+n,cmp);
    int num=1;
    sta[1].p=ro[0].p;
    sta[1].a=ro[0].a;
    sta[1].flag=1;;
    for(int i=1;i<n;i++){
    if(ro[i].p<sta[num].p&&ro[i].a>sta[num].a){
    ++num;
    sta[num].p=ro[i].p;
    sta[num].a=ro[i].a;
    sta[num].flag=1;
    }
    else if(ro[i].p==sta[num].p&&ro[i].a==sta[num].a)
    {
    sta[num].flag=0;//这个人不可能成为第一名
    }
    }
    if(num==1){
    if(sta[num].flag) printf("1\n");
    else printf("0\n");
    continue;
    }
    int nn=2;
    ans[1]=1;
    ans[2]=2;
    for(int i=2;i<=num;i++){
    do{
    long long int p1=(sta[ans[nn]].p-sta[i].p)*(sta[ans[nn]].a-sta[ans[nn-1]].a);
    long long int p2=(sta[ans[nn-1]].p-sta[ans[nn]].p)*(sta[i].a-sta[ans[nn]].a);
    if(p1<=p2) nn--;
    else break;
    }
    while(nn>=2);
    ++nn;
    ans[nn]=i;
    }
    int Ans=0;
    for(int i=1;i<=nn;i++){
    // printf("%d\b",ans[i]);
    if(sta[ans[i]].flag) Ans++;
    }
    printf("%d\n",Ans);
    }
    return 0;
    }