zoukankan      html  css  js  c++  java
  • 整数快速幂hdu(1852)

    hdu1852

    Beijing 2008

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)
    Total Submission(s): 502 Accepted Submission(s): 172


    Problem Description
    As we all know, the next Olympic Games will be held in Beijing in 2008. So the year 2008 seems a little special somehow. You are looking forward to it, too, aren't you? Unfortunately there still are months to go. Take it easy. Luckily you meet me. I have a problem for you to solve. Enjoy your time.

    Now given a positive integer N, get the sum S of all positive integer divisors of 2008N. Oh no, the result may be much larger than you can think. But it is OK to determine the rest of the division of S by K. The result is kept as M.

    Pay attention! M is not the answer we want. If you can get 2008M, that will be wonderful. If it is larger than K, leave it modulo K to the output. See the example for N = 1,K = 10000: The positive integer divisors of 20081 are 1、2、4、8、251、502、1004、2008,S = 3780, M = 3780, 2008M % K = 5776.


    Input
    The input consists of several test cases. Each test case contains a line with two integers N and K (1 ≤ N ≤ 10000000, 500 ≤ K ≤ 10000). N = K = 0 ends the input file and should not be processed.

    Output
    For each test case, in a separate line, please output the result.

    Sample Input
    1 10000 0 0
    分析:

    // 这题主要求S
    // 结论: S = (251^(n+1)-1) * (2^(3n+1)-1) / 250 
    // 是两个等比数列和相乘 
    // 
    // 推理:
    // 2008 = 2^3 * 251 
    // 所以 2008^N 有 3N 个 2 和 N 个251 
    // 所有仅由2组成的因子有
    // 2^0 2^1 2^2 ... 2^(3N)
    // 设集合 C = {2^0, 2^1, 2^2 ...,2^(3N)};
    // SUM(C) =  2^(3n+1)-1

    // 跟251组合产生的因子有
    // 251^0 * C
    // 251^1 * C
    // ...
    // 251^N * C

    // 所有因子和为:
    // S = (251^(n+1)-1))/250 * (2^(3n+1)-1)

    // 计算S%K:

    // S 很大, 不能保存在普通的数据类型中, 需要直接计算S%K
    // 因为S有个分母250, 设 S = X/250
    // 则S%K = (X/250)%K = (X%(250*K))/250
    // 变成先求余数再除法的形式

    程序:

    #include"stdio.h"
    #include"string.h"
    __int64 pow(__int64 a,__int64 k,__int64 m)
    {
         __int64 b=1;
         while(k>=1)
         {
              if(k&1)
                   b=b*a%m;
              a=a*a%m;
              k=k/2;
         }
         return b;
    }
    int main()
    {
         __int64 n,k,ans,m,p1,p2,s;
         while(scanf("%I64d%I64d",&n,&k),k||n)
         {
              p1=pow(2,3*n+1,k*250)-1;
              p2=(pow(251,n+1,k*250)-1);
              s=(p1*p2)%(250*k);
              m=s/250;
              //printf("%I64d %I64d %I64d
    ",p1,p2,m);
              ans=pow(2008,m,k);
              printf("%I64d
    ",ans);
         }
    }
    


  • 相关阅读:
    com.panie 项目开发随笔_前后端框架考虑(2016.12.8)
    Jsoup 使用教程:数据抽取
    Jsoup 使用教程:输入
    项目中图片处理总结
    jsonp 跨域请求
    由Memcached升级到 Couchbase的 Java 客户端的过程记录(三)
    由Memcached升级到 Couchbase的 Java 客户端的过程记录(二)
    jquery eval解析JSON中的注意点介绍
    JS禁止WEB页面鼠标事件大全
    jQuery事件之鼠标事件
  • 原文地址:https://www.cnblogs.com/mypsq/p/4348253.html
Copyright © 2011-2022 走看看