zoukankan      html  css  js  c++  java
  • HDU_5690_快速幂,同余的性质

    All X

    Time Limit: 2000/1000 MS (Java/Others)   

     Memory Limit: 65536/65536 K (Java/Others)


    Problem Description
     
    F(x,m) 代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立:

    F(x,m) mod k  c
     
    Input
     
    第一行一个整数T,表示T组数据。
    每组测试数据占一行,包含四个数字x,m,k,c

    1x

    1m10^10

    0c<k10,000
     
    Output
     
    对于每组数据,输出两行:
    第一行输出:"Case #i:"。i代表第i组测试数据。
    第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
     
    Sample Input
     
    3
    1 3 5 2
    1 3 5 1
    3 5 99 69
     
    Sample Output
     
    Case #1:
    No
    Case #2:
    Yes
    Case #3:
    Yes
     
     同余的性质还需要熟悉。
    思路:
     
    m个x组成的数可以表示为x*(1+10+10^2+...+10^m-1)=x*(10^m-1)/9;
    即x*(10^m-1)/9%k==c?    x*(10^m-1)%(9*k)==9*c
     
    同余的性质:
      (1)自反性:a≡a(mod m).
      (2)对称性:若a≡b(mod m),则b≡a(mod m).
      (3)传递性:若a≡b(mod m),b≡c(mod m),则a≡c(mod m).
     
       若a1≡b1(mod m),a2≡b2(mod m),
      (4) 则a1+a2≡b1+b2(mod m)
        推论:若a+b≡c(mod m),则a≡c-b(mod m)
      (5)  a1a2≡b1b2(mod m).
       推论1:若a≡b(mod m),则ak≡bk(mod m),其中k为整数.
         推论2:若a≡b(mod m),则a^n≡b^n(mod m),其中n为自然数.
     
     
      (6)  若ac≡bc(mod m),(m,c)=d, 则a≡b(mod m/d).
        特别地,当(m,c)=1是,有a≡b(mod m).
      (7)  若a≡b(mod m),则ak≡bk(mod mk),其中k为大于零的整数;
         若a≡b(mod m),d为a,b及m 的任一正公约数,则a/d≡b/d(mod (m/d)).
      (8)  a≡b(mod mi),(1<=i<=n),则a≡b(mod [m1,m2,…,mn]).
      (9)  若a≡b(mod m),且d|m,则a≡b(mod d)
     
    此题用到了第(7)条性质。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<stdlib.h>
    using namespace std;
    #define LL long long
    
    LL powMod(LL base,LL m,int mod)
    {
        LL res=1;
        while(m)
        {
            if(m&1)
                res=(res*base)%mod;
            base=(base*base)%mod;
            m>>=1;
        }
        return(res%mod);
    }
    
    int main()
    {
        int x,k,c,cas=1;
        LL m;
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%I64d%d%d",&x,&m,&k,&c);
            //cout<<"*"<<endl;
            int MOD=9*k;
            int tmp=powMod(10,m,MOD);
            //cout<<tmp<<endl;
            tmp=(tmp*x)%MOD;
            tmp-=(x%MOD);
            //cout<<tmp<<endl;
            printf("Case #%d:
    ",cas++);
            if(tmp==9*c)
                printf("Yes
    ");
            else
                printf("No
    ");
        }
        return 0;
    }
  • 相关阅读:
    算法题---最长公共前缀
    算法练习题---罗马数字转int
    算法练习题---原地删除数组元素
    获取当前服务的IP和端口号
    算法练习题---回文数
    Java数学表示式解析工具- jeval
    Redis的安装与部署
    Centos开机自启动redis
    Java 7 的 7 个新的 “酷” 特性
    java7新特性——使用ThreadLocalRandom产生并发随机数
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/5775666.html
Copyright © 2011-2022 走看看