QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#115379#5424. NaN in a HeapGeothermal#AC ✓976ms4836kbC++175.2kb2023-06-26 06:22:562023-06-26 06:22:58

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-26 06:22:58]
  • 评测
  • 测评结果:AC
  • 用时:976ms
  • 内存:4836kb
  • [2023-06-26 06:22:56]
  • 提交

answer

#include "bits/stdc++.h"
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;
 
typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;
 
typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template<class T> using pq = priority_queue<T>;
template<class T> using pqg = priority_queue<T, vector<T>, greater<T>>;
 
#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
#define trav(a,x) for (auto& a : x)
#define uid(a, b) uniform_int_distribution<int>(a, b)(rng)
 
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define ins insert

template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifdef DEBUG
#define dbg(x...) cerr << "\e[91m"<<__func__<<":"<<__LINE__<<" [" << #x << "] = ["; _print(x); cerr << "\e[39m" << endl;
#else
#define dbg(x...)
#endif


const int MOD = 1000000007;
const char nl = '\n';
const int MX = 100001; 


struct mi {
	ll v; explicit operator ll() const { return v; }
	mi() { v = 0; }
	mi(ll _v) { 
		v = (-MOD < _v && _v < MOD) ? _v : _v % MOD;
		if (v < 0) v += MOD;
	}
	friend bool operator==(const mi& a, const mi& b) { 
		return a.v == b.v; }
	friend bool operator!=(const mi& a, const mi& b) { 
		return !(a == b); }
	friend bool operator<(const mi& a, const mi& b) { 
		return a.v < b.v; }
   
	mi& operator+=(const mi& m) { 
		if ((v += m.v) >= MOD) v -= MOD; 
		return *this; }
	mi& operator-=(const mi& m) { 
		if ((v -= m.v) < 0) v += MOD; 
		return *this; }
	mi& operator*=(const mi& m) { 
		v = v*m.v%MOD; return *this; }
	mi& operator/=(const mi& m) { return (*this) *= inv(m); }
	friend mi pow(mi a, ll p) {
		mi ans = 1; assert(p >= 0);
		for (; p; p /= 2, a *= a) if (p&1) ans *= a;
		return ans;
	}
	friend mi inv(const mi& a) { assert(a.v != 0); 
		return pow(a,MOD-2); }
		
	mi operator-() const { return mi(-v); }
	mi& operator++() { return *this += 1; }
	mi& operator--() { return *this -= 1; }
    mi operator++(int) { v++; if (v == MOD) v = 0; return mi(v); }
    mi operator--(int) { v--; if (v < 0) v = MOD-1; return mi(v); }
	friend mi operator+(mi a, const mi& b) { return a += b; }
	friend mi operator-(mi a, const mi& b) { return a -= b; }
	friend mi operator*(mi a, const mi& b) { return a *= b; }
	friend mi operator/(mi a, const mi& b) { return a /= b; }
    friend ostream& operator<<(ostream& os, const mi& m) {
        os << m.v; return os;
    }
    friend istream& operator>>(istream& is, mi& m) {
        ll x; is >> x;
        m.v = x;
        return is;
    }
};


typedef vector<mi> vmi;
typedef pair<mi,mi> pmi;
typedef vector<pmi> vpmi;

void __print(mi X) {
    cout << X.v;
}

map<int, mi> pnn;

int compLeft(int N) {
    if (N <= 2) return 0;
    int val = 1;
    while (2*(2*val+1) <= N-1) val = 2*val+1;
    return min(2*val+1, N-1-val);
}

mi getNoNAN(int N) {
    if (N == 0) return 1;
    if (pnn.count(N)) return pnn[N];
    int left = compLeft(N);
    int right = N - left- 1;
    return pnn[N] = inv(mi(N)) * getNoNAN(left) * getNoNAN(right);
}

vmi pth;
mi getNAN(int N) {
    if (N == 0) return 0;
    int left = compLeft(N); int right = N-left-1;
    mi invN = inv(mi(N));

    mi aug = invN;
    F0R(i, sz(pth)) {
        aug *= inv(pth[i] - N);
    }
    mi ans = aug * getNoNAN(left) * getNoNAN(right);
    pth.pb(N); //pthInv.pb(invN);
    mi probLeft = getNAN(left);
    mi probRight = probLeft; if (left != right) probRight = getNAN(right);
    ans += left * invN * probLeft * getNoNAN(right) + right * invN * getNoNAN(left) * probRight;
    pth.pop_back(); //pthInv.pop_back();
    return ans;
}

void solve() {
    int N; cin >> N;
    cout << getNAN(N) << nl;

}
 
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    int T = 1;
    cin >> T;
    while(T--) {
        solve();
    }

	return 0;
}



詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 3580kb

input:

5
1
3
7
10
20221218

output:

1
666666672
55555556
596445110
3197361

result:

ok 5 number(s): "1 666666672 55555556 596445110 3197361"

Test #2:

score: 0
Accepted
time: 29ms
memory: 3508kb

input:

1000
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101...

output:

1
1
666666672
375000003
633333338
97222223
55555556
822222228
123456791
596445110
229888169
878681664
673617560
436681157
699563287
68610901
902106812
308824953
904504598
779800169
693423362
328728506
466956451
68896808
88594095
156207594
533144330
758445723
92289701
206321076
267778621
266415260
48...

result:

ok 1000 numbers

Test #3:

score: 0
Accepted
time: 976ms
memory: 4836kb

input:

1000
1000000000
999999999
999999998
999999997
999999996
999999995
999999994
999999993
999999992
999999991
999999990
999999989
999999988
999999987
999999986
999999985
999999984
999999983
999999982
999999981
999999980
999999979
999999978
999999977
999999976
999999975
999999974
999999973
999999972
9999...

output:

191769339
839078655
63430702
488796230
588110810
163742647
964465260
961862258
425060141
344042065
747463620
143548999
281463738
797756640
382302841
365802993
511891059
902367958
70796927
495040138
33561329
728278059
879674300
992542203
309248753
251669085
188046077
672990625
635281273
113409431
972...

result:

ok 1000 numbers

Test #4:

score: 0
Accepted
time: 879ms
memory: 4560kb

input:

1000
524125987
923264237
374288891
535590429
751244358
124321145
232930851
266089174
543529670
773363571
319728747
580543238
582720391
468188689
490702144
598813561
138628383
284660056
733781508
155605777
931759705
245485733
723534730
257812292
794937524
596788519
188451996
981010588
14483682
592676...

output:

726166876
355333772
482635633
758157044
775831523
760255234
748551027
477359472
86466892
226497967
994190156
546377096
39059573
537362710
398171443
66921908
845526053
340839799
621258613
555318917
603009173
528685604
550082786
978381020
650853592
125984432
139054932
319259349
481246666
178000233
799...

result:

ok 1000 numbers