1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <bits/stdc++.h> using namespace std;
int main(){ const int N = 250250; const int M = 250; const unsigned long long MOD = 10000000000000000ULL;
vector<unsigned long long> dp(M, 0), ndp(M, 0); dp[0] = 1;
auto modpow = [](unsigned long long a, unsigned long long e)->int{ unsigned long long base = a % 250; unsigned long long res = 1 % 250; while(e){ if(e & 1) res = (res * base) % 250; base = (base * base) % 250; e >>= 1; } return (int)res; };
for(int i = 1; i <= N; ++i){ int v = modpow((unsigned long long)i, (unsigned long long)i); for(int r = 0; r < M; ++r){ int from = r - v; if(from < 0) from += M; unsigned __int128 sum = (unsigned __int128)dp[r] + (unsigned __int128)dp[from]; unsigned long long val = (unsigned long long)(sum % MOD); ndp[r] = val; } dp.swap(ndp); }
unsigned long long ans = dp[0]; if(ans == 0) ans = (MOD - 1); else ans = (ans + MOD - 1) % MOD;
printf("%016llu\n", ans); return 0; }
|