2020hdu多校1

题目
hdu6754
规律题

#include <iostream>
#include <cstdio>
using namespace std;
const int mod=998244353;
/*int fastpow(int a,int n)
{
    int res=1;
    int temp=a;
    while(n)
    {
        if(n&1)
        {
            res=(1ll*res*temp)%mod;
        }
        temp=(1ll*temp*temp)%mod;
        n>>=1;
    }
    return res;
}*/
int main()
{
    int t;
    int n;
    for(scanf("%d",&t);t--;)
    {
        scanf("%d",&n);
        if(n==1)
            printf("26\n");
        else if(n==2)
            printf("676\n");
        else if(n==3)
            printf("17576\n");
        else
            printf("15600\n");
        //printf("%d\n",fastpow(26,n));

    }
    return 0;
}

hdu 6754
题目
题意 :
就是f[0]=0,f[1]=1;
f[i]=f[i-1]+f[i-2]
求(f0)k+ (fc)k+(f2c)k+(f3c)k…(fnc)k
mod 为1e9+9
斐波那契
在这里插入图片描述
f0
费马定理
p 是一个质数
a^(p-1)mod p=1 mod p
a^(p-2)mod p=1/a mod p

#include <iostream>

using namespace std;
typedef long long ll;
const ll D=691504012;//1/A;
const ll C=276601605;//1/D;
const ll B=308495997;//(1-D)/2;
const ll A=691504013;//(1+D)/2;
const int mod=1e9+9;
ll n,c,k;
ll fast_pow(int a,ll n)
{
    ll res=1;
    ll temp=a;
    while(n)
    {
        if(n&1)
        {
            res=res*temp%mod;
        }
        temp=temp*temp%mod;
        n>>=1;
    }
    return res%mod;
}
const int kk=1e5+5;
ll inv[kk];
ll fact[kk];
ll invfact[kk];
void getinv(ll mod)
{
    inv[1]=1;
    for(int i=2;i<kk;i++)
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
void init()
{
    fact[0]=1;
    invfact[0]=1;
    for(int i=1;i<kk;i++)
    {
        fact[i]=fact[i-1]*i%mod;
        invfact[i]=invfact[i-1]*inv[i]%mod;
    }
}
ll getC(int m,int n)
{
    if(m<0||m>n)
        return -1;
    return fact[n]*invfact[m]%mod*invfact[n-m]%mod;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    getinv(mod);
    init();
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>c>>k;
        ll DD=fast_pow(C,k);
        ll Ac=fast_pow(A,c%(mod-1));
        ll Bc=fast_pow(B,c%(mod-1));
        ll Dc=fast_pow(D,c%(mod-1));
        ll Ak=fast_pow(Ac,k);
        ll res=0;
        ll ans=0;
        ll di;
        ll fen;
        ll a1=Ak;
        ll temp=Dc*Bc%mod;
        ll cki;
        for(int i=0;i<=k;i++)
        {
            cki=getC(i,k)%mod;
            if(i%2!=0)
            {
                cki=(mod-cki)%mod;
            }
            if(i!=0)
                a1=a1*temp%mod;
            if(a1==1)
            {
                res=(res+n%mod*cki%mod)%mod;
                continue;
            }
            di=fast_pow((1+mod-a1)%mod,mod-2);
            fen=fast_pow(a1,n%(mod-1));
            fen=(1+mod-fen)%mod;
            fen=fen*a1%mod;
            ans=fen*di%mod;
            ans=ans*cki%mod;
            res=(res+ans)%mod;
        }
        res=res*DD%mod;
        cout<<res<<"\n";
    }
    return 0;
}

hdu6759
题目
先按p 再按 a 排序
把后面a比前面小的删掉不可能第一
然后把1 2 放入集合 如果后面的能 比 前面一个赶上前面前面一个前赶上前面一个
那么前面一个下班 ,后面一个再跟前面继续比较,直到不行或者前面只有一个那么直接放进去
还有把一开始p a都相同的标记一下,也就是说永远都不可能第一
然后在集合里计数(没有被标记的)

#include <bits/stdc++.h>

using namespace std;
typedef  long long ll;
typedef struct node
{
    int p,a;
    int flag;
    operator < (const node &b)
    {
        if(p!=b.p)
            return p>b.p;
        return a>b.a;
    }
}node;
node no[50005];
vector<node> vv;
vector<node> uu;
int res;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int T;
    cin>>T;
    while(T--)
    {
        vv.clear();
        uu.clear();
        res=0;
        int n;
        cin>>n;
        if(n==1)
        {
            int x,y;
            cin>>x,y;
            cout<<"1"<<"\n";
            continue;
        }
        for(int i=0;i<n;i++)
        {
            cin>>no[i].p>>no[i].a;
            no[i].flag=0;
        }
        sort(no,no+n);
        for(int i=1;i<n;i++)
        {
            if(no[i].p==no[i-1].p&&no[i].a==no[i-1].a)
            {
                no[i-1].flag=no[i].flag=1;
            }
        }
        vv.push_back(no[0]);
        for(int i=1;i<n;i++)
        {
            node bb=vv[vv.size()-1];
            if(no[i].a>bb.a)
            {
                vv.push_back(no[i]);
            }
        }
        if(vv.size()<=1)
        {
            if(vv[0].flag==0)
                cout<<"1"<<"\n";
            else
                cout<<"0"<<"\n";
            continue;
        }
        uu.push_back(vv[0]);
        uu.push_back(vv[1]);
        for(int i=2;i<vv.size();i++)
        {
            node aa,bb;
            node cc=vv[i];
            while(true)
            {
                if(uu.size()==1)
                    break;
                aa=uu[uu.size()-2];
                bb=uu[uu.size()-1];
                ll t1=1ll*(aa.p-bb.p)*(cc.a-bb.a);
                ll t2=1ll*(bb.p-cc.p)*(bb.a-aa.a);
                if(t2<=t1)
                {
                    uu.pop_back();
                }
                else
                    break;
            }
            uu.push_back(cc);
        }
        for(int i=0;i<uu.size();i++)
        {
            if(uu[i].flag==0)
            {
                res++;
            }
        }
        cout<<res<<"\n";
    }
    return 0;
}

hdu6756
题目
分块更新

#include <bits/stdc++.h>

using namespace std;
const int maxn=1e5+5;
int Bigsize;
int a[maxn];
int du[maxn];
struct node
{
    int v,next;
};
node no[maxn*10];
int head[maxn];
int cnt;
vector <int> re[maxn];
vector <int> to[maxn];
vector <pair<int ,int > > dis[maxn];
void add(int x,int y)
{
    no[cnt].v=y;
    no[cnt].next=head[x];
    head[x]=cnt;
    cnt++;
}
void insert_(int u,int x)
{
    if(x>=du[u])
        x=du[u];
    re[u][x]++;
    if(re[u][x]==1)
    {
        to[u][x/Bigsize]++;
    }
}
void delete_(int u,int x)
{
    if(x>=du[u])
        x=du[u];
    re[u][x]--;
    if(re[u][x]==0)
    {
        to[u][x/Bigsize]--;
    }
}
int query(int u)
{
    int j;
    for(int i=0;i<=du[u]/Bigsize;i++)
    {
        if(to[u][i]!=Bigsize)
        {
            j=i*Bigsize;
            break;
        }
    }
    for(int i=0;i<Bigsize;i++)
    {
        if(!re[u][i+j])
        {
            j=i+j;
            break;
        }
    }
    return j;
}
/*int query(int u)
{
    for(int i=0;i<=du[u];i++)
    {
        if(to[u][i/Bigsize]==Bigsize)
        {
            i=i+Bigsize-1;
            continue;
        }
        for(int j=0;j<Bigsize;j++)
        {
            if(re[u][i+j]==0)
            {
                return i+j;
            }
        }
    }
}*/
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int T;
    cin>>T;
    while(T--)
    {
        cnt=1;
        int n,m;
        cin>>n>>m;
        Bigsize=sqrt(n);
        for(int i=1;i<=n;i++)
        {
            re[i].clear();
            to[i].clear();
            dis[i].clear();
            head[i]=0;
            cin>>a[i];
        }
        for(int i=1;i<=m;i++)
        {
            int a,b;
            cin>>a>>b;
            du[a]++;
            du[b]++;
            add(a,b);
            add(b,a);
        }
        for(int i=1;i<=n;i++)
        {
            re[i].resize(du[i]+5);
            to[i].resize(du[i]/Bigsize+5);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=head[i];j;j=no[j].next)
            {
                int v=no[j].v;
                insert_(i,a[v]);
                if(du[v]>Bigsize)
                {
                    dis[i].push_back({v,a[v]});
                }
            }
        }
        int q;
        cin>>q;
        for(int i=1;i<=q;i++)
        {
            int op;
            cin>>op;
            if(op==1)
            {
                int x, y;
                cin>>x>>y;
                if(du[x]>Bigsize)
                {
                    a[x]=y;
                }
                else
                {
                    for(int j=head[x];j;j=no[j].next)
                    {
                        int v=no[j].v;
                        delete_(v,a[x]);
                        insert_(v,y);
                    }
                    a[x]=y;
                }
            }
            else
            {
                int x;
                cin>>x;
                for(int j=0;j<dis[x].size();j++)
                {
                    int v=dis[x][j].first;
                    int w=dis[x][j].second;
                    if(w==a[v])
                        continue;
                    delete_(x,w);
                    insert_(x,a[v]);
                    dis[x][j].second=a[v];
                }
                cout<<query(x)<<"\n";
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值