計蒜客 藍橋杯模擬 充話費

 
 

上完廁所後,蒜頭君的手機欠費了,因而他來到了中國移動營業廳。正當他準備交錢時,忽然發現錢包不見了。html

「奇怪,今天出門時明明帶了錢包。」蒜頭君自言自語道。ios

「彆着急,今天推出了一個新活動。只要計算出這道題的答案,就送 999999 元話費」工做人員指着一塊公告牌耐心地說。ide

只見公告牌上寫着,計算 1^{2019}+2^{2019}+3^{2019}+\ldots+n^{2019}12019+22019+32019++n2019 對 1008610086 取模的結果,其中 n=10^{12}n=1012。ui

請你幫助蒜頭君計算答案。spa

 

題解:debug

由於 n^2019 = (n%10086)^2019,因此每10086個數的2019次方的和都是相等的htm

即 ans = 1^2019+2^2019+...+10086^2019 = 10087^2019+10088^2019+...+2*10086^2019blog

所以10^12中有n^12/10086個完整週期,這些完整週期的和是單個週期和ans乘以週期數ip

最後再加上不足一個週期的其餘數的和就是答案string

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define ls (r<<1)
#define rs (r<<1|1)
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
const ll maxn = 1e6+10;
const ll mod = 10086;
const double pi = acos(-1.0);
const double eps = 1e-8;
ll qow( ll a, ll b ) {
    ll ans = 1;
    while( b ) {
        if( b&1 ) {
            ans = ans*a%mod;
        }
        a = a*a%mod;
        b /= 2;
    }
    return ans;
}
int main() {
    ll ans = 0, t = 1e12;
    for( ll i = 1; i <= mod; i ++ ) {
        ans = (ans+qow(i%mod,2019))%mod;
    }
    ans = ans*(t/mod)%mod;
    t = t%mod;
    for( ll i = 1; i <= t; i ++ ) {
        ans = (ans+qow(i%mod,2019))%mod;
    }
    cout << ans << endl;
    return 0;
}

  

相關文章
相關標籤/搜索