天天看點

Leading and Trailing (快速取模和數字取前三位)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const int modn=1000;
//快速取模
ll powermod(ll x,ll mod,ll n)
{
    ll ans = 1;
    while(n>0)
    {
        if(n & 1) ans = ans*x%mod;
        x = x*x%mod;
        n >>= 1;//位運算相當于除2
    }
    return ans;
}

int main()
{

    int t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        ll n,k;
        ll lead,trail=1;
        cin>>n>>k;
        //後三位
        trail=powermod(n,modn,k);

        //前三位這個有關于一個知識點恩。n可以表示為10^a,n^k=10^ak=10^x*10^y,,x y分别表示ak的小數部分和整數部分
        //double a=(double)log(n)/(double)log(10);
         double a=(double)log10(1.0*n);
         a=a*k;
         a=a-ll(a);
         lead=pow(10,a)*100;

        printf("Case %d: %lld %03lld\n",i,lead,trail);
     } 
    return 0;
 }