• 2017-7-22 NOIP模拟赛


    Digits

    (digits.cpp/c/pas)

    Description
    给一个关于 的多项式,并给定一个 ,求该多项式在带入该 时的值最后 位数字。
    Input
    第一行两个整数 、 ;
    之后的 行,每行两个数 和 ,表示多项式的一项 ;
    最后一行一个整数 。
    Output
    输出 行,按顺序输出该多项式带入 后值的最后 位数字,若不足 位,则高位补零。
    Example
    digits.in digits.out
    2 1
    3 2
    1 5
    3
    0
    附加样例见选手目录下『digits』文件夹。
    Hint
    对于 的数据, ;
    对于 的数据, 。

    /*
        要求后k位,实际上就是对10^k取模,用快速幂
    */
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    long long n,k,a[100010],b[100010],X,tmp[10],mod,ans,Ans[10];
    using namespace std;
    long long Pow(long long x,long long t){
        long long res=1;
        while(t){
            if(t&1)
                res=x*res%mod;
            x=x*x%mod;
            t>>=1;
        }
        return res;
    }
    int main(){
        freopen("digits.in","r",stdin);
        freopen("digits.out","w",stdout);
        scanf("%lld%lld",&n,&k);
        for(long long i=1;i<=n;i++)scanf("%lld%lld",&a[i],&b[i]);
        scanf("%lld",&X);
        mod=1;
        for(long long i=1;i<=k;i++)mod*=10;
        X%=mod;
        for(long long i=1;i<=n;i++){
            long long now=((a[i]%mod)*Pow(X,b[i]))%mod;
            ans+=now;
        }
        for(long long i=1;i<=k;i++){
            Ans[i]=ans%10;
            ans/=10;
        }
        for(long long i=k;i>=1;i--)cout<<Ans[i]<<endl;
        fclose(stdin);
        fclose(stdout);
        return 0;
    }

    Equation

    (equation.cpp/c/pas)
    Description
    求方程 在 内有多少组正整数解。
    Input
    一行七个整数 。
    Output
    一行一个整数,原方程有多少正整数解。
    Example
    equation.in equation.out
    10 -24 74 -25 22 -7 -22 5
    附加样例见选手目录下『equation』文件夹。
    Hint
    对于 的数据,方程无解;
    对于 的数据, ;
    对于 的数据, 。

    /*
        a1x1-a2x2+a3x3-a4x4+a5x5-a6x6=0 
        方程可化为 a1x1-a2x2+a3x3=a4x4-a5x5+a6x6 
        通过映射匹配,2n^3跑得过 
    */
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<map>
    using namespace std;
    map<int,int>b;
    int a[7],K,ans;
    int main(){
        freopen("equation.in","r",stdin);
        freopen("equation.out","w",stdout);
        scanf("%d",&K);
        bool flag1,flag2;
        for(int i=1;i<=6;i++){
            scanf("%d",&a[i]);
            if(a[i]>0)flag1=1;
            if(a[i]<0)flag2=1;
        };
        a[2]=-a[2];a[4]=-a[4];a[6]=-a[6];
        if(flag1!=flag2){
            printf("0");
            return 0;
        }
        for(int i=4;i<=6;i++)a[i]=-a[i];
        int now;
        for(int i=1;i<=K;i++)
            for(int j=1;j<=K;j++)
                for(int k=1;k<=K;k++){
                    now=a[1]*i+a[2]*j+a[3]*k;
                    b[now]++;
                }
        for(int i=1;i<=K;i++)
            for(int j=1;j<=K;j++)
                for(int k=1;k<=K;k++){
                    now=a[4]*i+a[5]*j+a[6]*k;
                    ans+=b[now];
                }
        printf("%d",ans);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }

    Graph

    ( graph .cpp/c/pas)
    Description
    小 Y 又开始了一段旅途。
    这次,他要经过一个图,从 号点到达 号点,每个点设有休息站。
    小 Y 计划用最多 天走完全程,除第 天外,每一天小 Y 都必须在休息站过夜。所以,一段路
    必须在同一天走完。
    小 Y 的体力有限,他希望走的路程最大的一天中走的路尽可能少,请求出这个最小值。
    Input
    第一行三个整数 、 、 表示图的顶点数、边数、天数。
    从第二行开始,之后的 行,每行三个整数 、 、 表示从 和 间有一条双向道路,长度
    为 。
    Output
    一行一个正整数,如果小 Y 能走完全程,输出走的路程最大的一天中走的路程最小值,否则输
    出 。
    Example
    graph.in graph.out
    3 2 4
    3 2 4
    1 2 1
    4
    附加样例见选手目录下『graph』文件夹。
    Hint
    对于 的数据, ;
    对于 的数据, ;
    对于 的数据, , , ;
    保证没有重边和自环。

    /*
        求出最小生成树,答案一定在最小生成树上;
        如果起点和终点不联通,输出-1;
        答案为最小生成树上起点和终点间唯一路径上的最大边权。
    */
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct node{
        int from,to,v;
    }e[200010];
    int fa[7510],m,n,k;
    bool cmp(node x,node y){
        return x.v<y.v;
    }
    int find(int x){
        if(fa[x]==x)return x;
        return fa[x]=find(fa[x]);
    }
    bool connect(int x,int y){
        int f1=find(x),f2=find(y);
        if(f1==f2)return 0;
        fa[f1]=f2;
        return 1;
    }
    int main(){
        freopen("graph.in","r",stdin);
        freopen("graph.out","w",stdout);
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)
          fa[i]=i;
        for(int i=1;i<=m;i++)
          scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].v);
        sort(e+1,e+m+1,cmp);
        bool flag=false;int tot=0;
        for(int i=1;i<=m;i++){
            if(connect(e[i].from,e[i].to))tot++;
            if(find(1)==find(n)){
                printf("%d",e[i].v);
                flag=true;
                break;
            }
            if(tot==n-1)break;
        }
        if(!flag)printf("-1");
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
  • 相关阅读:
    instanceof方法
    Java 实现接口计算圆柱的体积和面积并添加颜色
    Java代码执行顺序
    Java饿汉单例模式
    斐波那契数(动态规划和递归)
    Java 接口实现计算器加减乘除(字符交互界面)
    局部内部类详解_转载
    Java引用类型
    递归打印字符串
    时间复杂度
  • 原文地址:https://www.cnblogs.com/thmyl/p/7220830.html
Copyright © 2020-2023  润新知