zoukankan      html  css  js  c++  java
  • LightOj 1282 Leading and Trailing

    求n^k的前三位数字和后三位数字。

    范围: n (2 ≤ n < 231) and k (1 ≤ k ≤ 107).

    前三位: 设 n^k = x

             ---> lg(n^k)=lg(x)

             ---> klg(n)=lg(x)

             ---> x=10^(klgn).

         因为求前三位,klgn大于2的整数部分可以舍弃。bit=floor(klgn-2), x=10^(klgn-bit)。

    后三位:快速幂模1000即可。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    typedef long long ll;
    
    //n (2 ≤ n < 2^31) and k (1 ≤ k ≤ 10^7).
    
    ll mod_pow(ll a, ll b, ll mod)
    {
    	ll res = 1;
    	while (b > 0) {
    		if (b & 1) res = res * a % mod;
    		a = a * a % mod;
    		b >>= 1;
    	}
    	return res;
    }
    
    int calc(int n, int k)
    {
    	int bit = floor(k * log10(n) - 2);
    	return floor(pow(10, k * log10(n) - bit));
    }
    
    int main()
    {
    	int n, k;
    	int t;
    	scanf("%d", &t);
    	for (int cas = 1; cas <= t; ++cas) {
    		scanf("%d%d", &n, &k);
    		int first = calc(n, k);
    		int last = mod_pow(n, k, 1000);
    		printf("Case %d: %3d %03d
    ", cas, first, last);
    	}
        return 0;
    }
    

      

  • 相关阅读:
    第七周作业
    人月神话之没有银弹
    第六周作业
    第五周作业
    第四周作业
    第三周作业
    人月神话之沟通
    第二周作业
    第一周作业
    第八周作业
  • 原文地址:https://www.cnblogs.com/wenruo/p/4742317.html
Copyright © 2011-2022 走看看