Submission #22302

#TimeUsernameProblemLanguageResultExecution timeMemory
22302팀명을 한번 정하면 못바꿀까? (#40)Fully Generate (KRIII5_FG)C++14
7 / 7
253 ms118304 KiB
#include <stdio.h> #include <algorithm> #include <vector> #include <functional> #include <set> #include <map> #include <queue> #include <tuple> #include <string.h> using namespace std; #define rep(i,n) for(int (i)=0;(i)<(int)(n);(i)++) typedef long long ll; typedef pair<int, int> pi; const int MAX_K = 1e7, CAL_K = 31347587, MOD = 1e9 + 7; int G[MAX_K+1]; ll Sum[MAX_K+1]; int getG(ll v) { // if(v <= MAX_K) return G[v]; // else { int ix = lower_bound(Sum+1, Sum+MAX_K+1, v) - (Sum); return ix; // } } int ab(int a, int b) { int res = 1, val = a; while(b) { if(b%2) res = 1ll * res * val % MOD; val = 1ll * val * val % MOD; b/=2; } return res; } int main() { G[1] = 1; G[2] = 2; G[3] = 2; for(int ix=4, k=3; ix<=MAX_K;) { for(int p=0; p<G[k]; p++) if(ix+p <= MAX_K) G[ix+p] = k; ix += G[k]; k++; } ll sum = 0; for(int i=1; i<=MAX_K; i++) { sum += G[i]; Sum[i] = sum; } ll N; scanf("%lld", &N); int ans = 1, ix = 1; for(int i=1; ;) { // int cnt = getG(i); if(Sum[ix] < i) ix++; int cnt = ix; if(i % 100000 == 0) printf("%d\n", i); int jx = ix, last = -1, multi = 1; for(int j=i; ; j++) { if(Sum[jx] < j) jx++; if(jx != ix) break; if(N >= cnt) { N -= cnt; last = j; multi = 1ll * multi * j % MOD; } else break; } // printf("[%d - %d] last %d [%d]\n", i, last, last, N); if(last != -1) ans = 1ll * ans * ab(multi, cnt) % MOD; else { ans = 1ll * ans * ab(i, N) % MOD; break; } i = last + 1; } printf("%d\n", ans); return 0; }

Compilation message (stderr)

FG.cpp: In function 'int main()':
FG.cpp:48:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  ll N; scanf("%lld", &N);
                         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...