zoukankan      html  css  js  c++  java
  • hdu1852 Beijing 2008

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1852

    题目大意:

    求2008^n的所有因子和m对k取余,然后求2008^m对k取余。

    解题思路:

    首先将2008因式分解,2008 = 2^3 * 251

    所以2008^n = 2^(3n) * 251^(n)

    因子和m =(2^(3n+1)- 1) * (251^(n+1) - 1)/ 250

    m需要对k取余数。由于余数k和250可能不互质,也就是没有逆元存在,那么需要用到通用公式:

    所以可以用快速幂求出(2^(3n+1)- 1) mod k

    再求出(251^(n+1) - 1)mod (250 * k) / 250

    两者相乘再对k求余数作为2008的指数

    最后快速幂求出答案

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 ll pow(ll a, ll b, ll m)
     5 {
     6     ll ans = 1;
     7     a %= m;
     8     while(b)
     9     {
    10         if(b & 1)ans = ans * a % m;
    11         b /= 2;
    12         a *= a;
    13         a %= m;
    14     }
    15     return ans;
    16 }
    17 int main()
    18 {
    19     ll n, k;
    20     while(cin >> n >> k && n)
    21     {
    22         ll a = pow(2, 3 * n + 1, k) - 1;
    23         ll b = (pow(251, n + 1, 250 * k) - 1) % (250 * k);
    24         b /= 250;
    25         cout<<pow(2008, (a * b) % k, k)<<endl;//此处必须a*b需要先对k取余数,题目求的是因子和m对k取余数作为指数的值
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    第四次上课 PPT作业
    大道至简 读后感④
    第三次上课 PPT 课后测试
    大道至简 读后感③
    Java 02 课后作业
    Java 多个数字相加算法
    大道至简 读后感②
    wpf控件
    一个简单的prism mef例子
    c#弱事件(weak event)
  • 原文地址:https://www.cnblogs.com/fzl194/p/9018569.html
Copyright © 2011-2022 走看看