zoukankan      html  css  js  c++  java
  • 多校 2009 1

    HDU 2817  A

    给你 4  个数  a b c  k

    前三个可能是等差或者等比数列的前三项  求第K项 % 200907

    等比求一下快速幂

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    using namespace std ;
    
    #define ll __int64
    #define MAXN 5000
    #define mod 200907
    
    ll Quick(ll a,int b,int c)
    {
        ll ans=1;
        a=a%c;
        while(b>0)
        {
            if(b&1)
                ans=(ans*a)%c;
            b>>=1;
            a=(a*a)%c;
        }
        return ans;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            ll a,b,c,d,q;
            int k;
            ll an;
            scanf("%lld%lld%lld%d",&a,&b,&c,&k);
            if(b-a==c-b)
            {
                d=b-a;
                an=(a%mod+((d%mod)*(k-1))%mod+mod)%mod;
            }
            else
            {
                q=b/a;
                an=((a%mod)*Quick(q,k-1,mod)+mod)%mod;
            }
            printf("%lld
    ",an);
        }
        return 0;
    }
    View Code

    B 并查集   下面的点为根

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    using namespace std ;
    
    #define ll __int64
    #define MAXN 30100
    #define mod 200907
    
    int z[MAXN]; //父亲
    int w[MAXN];// 下面有多少
    int num[MAXN]; //以 i 为根 节点数目-1
    
    int find1(int a)
    {
        if(a==z[a])
            return a;
        else
        {
            int fa=z[a];
            z[a]=find1(fa);
            w[a]+=w[fa];
            return z[a];
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        for(int i=1;i<=30000;i++)
            z[i]=i;
    
        while(t--)
        {
            char s[10];
            int x,y;
            scanf("%s",s);
            if(s[0]=='M')
            {
                scanf("%d%d",&x,&y);
                int fx,fy;
                fx=find1(x);
                fy=find1(y);
                if(fx!=fy)
                {
                    z[fx]=fy;
                    w[fx]+=num[fy]+1;//这个点要加到fy的下一层
                    num[fy]+=num[fx]+1; //把fx的数目加上
                }
            }
            else
            {
                scanf("%d",&x);
                int fx=find1(x);//更新一下
                printf("%d
    ",w[x]);
            }
        }
        return 0;
    }
    View Code

    C 二分匹配

    w[i][j] =1 那么  i 行到 j 建边  然后匹配  路径的话 从前往后走就行了

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    #include<deque>
    #include<queue>
    
    using namespace std ;
    
    #define ll __int64
    #define MAXN 110
    #define inf  1000000007
    
    int z[MAXN][MAXN];
    struct node
    {
        int u,v,next;
    }edge[20010];
    int cnt;
    int head[2*MAXN];
    int   fa[220];
    bool vis[220];
    void add(int u,int v)
    {
        edge[cnt].u=u;
        edge[cnt].v=v;
        edge[cnt].next=head[u];
        head[u]=cnt++;
    }
    bool dfs(int u)
    {
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].v;
            if(vis[v]==1)
                continue;
            if(fa[v]==-1)
            {
                fa[v]=u;
                return 1;
            }
            vis[v]=1;
            if(dfs(fa[v]))
            {
                fa[v]=u;
                return 1;
            }
        }
        return 0;
    }
    int fa1[220];
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            memset(head,-1,sizeof(head));
            memset(fa,-1,sizeof(fa));
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    scanf("%d",&z[i][j]);
            cnt=0;//行 1 - n 新行 n+1 n+n;
    
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(z[i][j]==1)
                    {
                         add(i,j+n);
                         add(j+n,i);
                    }
                }
            }
            int ans=0;
            for(int i=1;i<=n;i++)
            {
                memset(vis,0,sizeof(vis));
                if(dfs(i))
                    ans++;
            }
            if(ans==n)
            {
                for(int i=n+1;i<=n*2;i++)
                    fa1[fa[i]]=i-n;
                int fa2[220];;
                for(int i=n+1;i<=n*2;i++)
                    fa2[fa[i]]=i-n;
                ans=0;
                for(int i=1;i<=n;i++)
                {
                    if(fa2[i]!=i)
                    {
                        ans++;
                        for(int j=i+1;j<=n;j++)
                        {
                            if(fa2[j]==i)
                            {
                                swap(fa2[j],fa2[i]);
                                break;
                            }
                        }
                    }
                }
                printf("%d
    ",ans);
                for(int i=1;i<=n;i++)
                {
                    if(fa1[i]!=i)
                    {
                        for(int j=i+1;j<=n;j++)
                        {
                            if(fa1[j]==i)
                            {
                                printf("R %d %d
    ",i,j);
                                swap(fa1[j],fa1[i]);
                                break;
                            }
                        }
                    }
                }
            }
            else
                printf("-1
    ");
        }
        return 0;
    }
    View Code

    F 广搜   我还以为是dfs 加最短路 难受   放优先队列里头直接跑  也没有证明

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    #include<deque>
    #include<queue>
    
    using namespace std ;
    
    #define ll __int64
    #define MAXN 1010
    #define inf  1000000007
    
    struct node
    {
        int x,y,step;
        friend operator < (node a, node b)
        {
            return a.step>b.step;
        }
    };
    priority_queue<node>q1;
    char z[MAXN][MAXN];
    bool vis[MAXN][MAXN];
    int s1[4]={1,0,-1,0};
    int s2[4]={0,1,0,-1};
    
    int main()
    {
    
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0&&m==n)
                break;
            memset(vis,0,sizeof(vis));
            for(int i=1;i<=n;i++)
                scanf("%s",z[i]+1);
            int sx,sy,ex,ey;
            while(!q1.empty())
                q1.pop();
            scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
            vis[sx][sy]=1;
            node a;
            a.x=sx;
            a.y=sy;
            a.step=0;
            q1.push(a);
            while(!q1.empty())
            {
                node now=q1.top();
                q1.pop();
                if(now.x==ex&&now.y==ey)
                {
                    printf("%d
    ",now.step);
                    break;
                }
                for(int i=0;i<4;i++)
                {
                    node b;
                    b.x=now.x+s1[i];
                    b.y=now.y+s2[i];
                    if(b.x>=1&&b.x<=n&&b.y>=1&&b.y<=m&&(!vis[b.x][b.y]))
                    {
                        vis[b.x][b.y]=1;
                        if(z[now.x][now.y]=='X')
                        {
                            if(z[b.x][b.y]=='X')
                                b.step=now.step;
                            else
                                b.step=now.step+1;
                        }
                        else
                        {
                            if(z[b.x][b.y]=='.')
                                b.step=now.step+1;
                            else
                                b.step=now.step;
                        }
                        q1.push(b);
                    }
                }
            }
        }
        return 0;
    }
    View Code

    H裸的线性欧拉筛nlonglong(n)

    处理出来前缀和

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    long long f[3000005];
    void get_eular()
    {
        for(int i=2;i<3000001;i++)
        {
            if(!f[i])
            {
                for(int j=i;j<3000001;j+=i)
                {
                    if(!f[j])
                        f[j]=j;
                    f[j]=f[j]/i*(i - 1);
                }
            }
        }
        for (int i=3;i<3000001;i++)
        {
            f[i]+=f[i-1];
        }
    }
    
    int main()
    {
        get_eular();
        int a,b;
        while(~scanf("%d %d",&a,&b))
        {
            printf("%lld
    ",f[b]-f[a-1]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    远程执行文件包含
    MSSQL2008 部署及开启远程连接
    schtasks 命令使用
    提权
    一个简单的Hibernate工具类HibernateUtil
    StandardServiceRegistryBuilder
    hibernate配置文件
    Hibernate入门
    mysql5.7.14安装与配置
    路漫漫兮其修远长,吾将上下而求索
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6875618.html
Copyright © 2011-2022 走看看