[hdu5351]找规律,大整数模板

题意:f(1)="a",f(2)="b",f(i)=f(i-1)+f(i-2),"+"表示连接符。给定n,m,求f(n)的前m个字符的“next值”。

思路:并不知道如何一步步推出结论,只能打个表找找规律了:找到最小的i使得f(i)>m+1,则答案就是m-f(i-2)。然后就是大整数模板了


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

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

#include <map>

#include <set>

#include <cmath>

#include <ctime>

#include <deque>

#include <queue>

#include <vector>

#include <cstdio>

#include <string>

#include <cstdlib>

#include <cstring>

#include <iostream>

#include <algorithm>

using namespace std;

#define X                   first

#define Y                   second

#define pb                  push_back

#define mp                  make_pair

#define all(a)              (a).begin(), (a).end()

#define fillchar(a, x)      memset(a, x, sizeof(a))

typedef long long ll;

typedef pair<intint> pii;

typedef unsigned long long ull;

#ifndef ONLINE_JUDGE

void RI(vector<int>&a,int n){a.resize(n);for(int i=0;i<n;i++)scanf("%d",&a[i]);}

void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>

void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?1:-1;

while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>

void print(const T t){cout<<t<<endl;}template<typename F,typename...R>

void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>

void print(T*p, T*q){int d=p<q?1:-1;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}

#endif

template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}

template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}

template<typename T>

void V2A(T a[],const vector<T>&b){for(int i=0;i<b.size();i++)a[i]=b[i];}

template<typename T>

void A2V(vector<T>&a,const T b[]){for(int i=0;i<a.size();i++)a[i]=b[i];}

const double PI = acos(-1.0);

const int INF = 1e9 + 7;

/* -------------------------------------------------------------------------------- */

struct BigInt {

    const static int maxI = 1e8;

    const static int Len = 8;

    typedef vector<int> vi;

    typedef long long LL;

    vi num;

    bool symbol;

    BigInt() {

        num.clear();

        symbol = 0;

    }

    BigInt(int x) {

        symbol = 0;

        if (x < 0) {

            symbol = 1;

            x = -x;

        }

        num.push_back(x % maxI);

        if (x >= maxI) num.push_back(x / maxI);

    }

    BigInt(bool s, vi x) {

        symbol = s;

        num = x;

    }

    BigInt(char s[]) {

        int len = strlen(s), x = 1, sum = 0, p = s[0] == ‘-‘;

        symbol = p;

        for (int i = len - 1; i >= p; i--) {

            sum += (s[i] - ‘0‘) * x;

            x *= 10;

            if (x == 1e8 || i == p) {

                num.push_back(sum);

                sum = 0;

                x = 1;

            }

        }

        while (num.back() == 0 && num.size() > 1) num.pop_back();

    }

    void push(int x) {

        num.push_back(x);

    }

    BigInt abs() const {

        return BigInt(false, num);

    }

    bool smaller(const vi &a, const vi &b) const {

        if (a.size() != b.size()) return a.size() < b.size();

        for (int i = a.size() - 1; i >= 0; i--) {

            if (a[i] != b[i]) return a[i] < b[i];

        }

        return 0;

    }

    bool operator < (const BigInt &p) const {

        if (symbol && !p.symbol) return true;

        if (!symbol && p.symbol) return false;

        if (symbol && p.symbol) return smaller(p.num, num);

        return smaller(num, p.num);

    }

    bool operator > (const BigInt &p) const {

        return p < *this;

    }

    bool operator == (const BigInt &p) const {

        return !(p < *this) && !(*this < p);

    }

    bool operator >= (const BigInt &p) const {

        return !(*this < p);

    }

    bool operator <= (const BigInt &p) const {

        return !(p < *this);

    }

    vi add(const vi &a, const vi &b) const {

        vi c;

        c.clear();

        int x = 0;

        for (int i = 0; i < a.size(); i++) {

            x += a[i];

            if (i < b.size()) x += b[i];

            c.push_back(x % maxI);

            x /= maxI;

        }

        for (int i = a.size(); i < b.size(); i++) {

            x += b[i];

            c.push_back(x % maxI);

            x /= maxI;

        }

        if (x) c.push_back(x);

        while (c.back() == 0 && c.size() > 1) c.pop_back();

        return c;

    }

    vi sub(const vi &a, const vi &b) const {

        vi c;

        c.clear();

        int x = 1;

        for (int i = 0; i < b.size(); i++) {

            x += maxI + a[i] - b[i] - 1;

            c.push_back(x % maxI);

            x /= maxI;

        }

        for (int i = b.size(); i < a.size(); i++) {

            x += maxI + a[i] - 1;

            c.push_back(x % maxI);

            x /= maxI;

        }

        while (c.back() == 0 && c.size() > 1) c.pop_back();

        return c;

    }

    vi mul(const vi &a, const vi &b) const {

        vi c;

        c.resize(a.size() + b.size());

        for (int i = 0; i < a.size(); i++) {

            for (int j = 0; j < b.size(); j++) {

                LL tmp = (LL)a[i] * b[j] + c[i + j];

                c[i + j + 1] += tmp / maxI;

                c[i + j] = tmp % maxI;

            }

        }

        while (c.back() == 0 && c.size() > 1) c.pop_back();

        return c;

    }

    vi div(const vi &a, const vi &b) const {

        vi c(a.size()), x(1, 0), y(1, 0), z(1, 0), t(1, 0);

        y.push_back(1);

        for (int i = a.size() - 1; i >= 0; i--) {

            z[0] = a[i];

            x = add(mul(x, y), z);

            if (smaller(x, b)) continue;

            int l = 1, r = maxI - 1;

            while (l < r) {

                int m = (l + r + 1) >> 1;

                t[0] = m;

                if (smaller(x, mul(b, t))) r = m - 1;

                else l = m;

            }

            c[i] = l;

            t[0] = l;

            x = sub(x, mul(b, t));

        }

        while (c.back() == 0 && c.size() > 1) c.pop_back();

        return c;

    }

    BigInt operator + (const BigInt &p) const {

        if (!symbol && !p.symbol) return BigInt(false, add(num, p.num));

        if (!symbol && p.symbol) {

            return *this >= p.abs() ?

            BigInt(false, sub(num, p.num)) : BigInt(true, sub(p.num, num));

        }

        if (symbol && !p.symbol) {

            return (*this).abs() > p ?

            BigInt(true, sub(num, p.num)) : BigInt(false, sub(p.num, num));

        }

        return BigInt(true, add(num, p.num));

    }

    BigInt operator - (const BigInt &p) const {

        return *this + BigInt(!p.symbol, p.num);

    }

    BigInt operator * (const BigInt &p) const {

        BigInt res(symbol ^ p.symbol, mul(num, p.num));

        if (res.symbol && res.num.size() == 1 && res.num[0] == 0)

            res.symbol = false;

        return res;

    }

    BigInt operator / (const BigInt &p) const {

        if (p == BigInt(0)) return p;

        BigInt res(symbol ^ p.symbol, div(num, p.num));

        if (res.symbol && res.num.size() == 1 && res.num[0] == 0)

            res.symbol = false;

        return res;

    }

    BigInt operator % (const BigInt &p) const {

        return *this - *this / p * p;

    }

    void show() const {

        if (symbol) putchar(‘-‘);

        printf("%d", num[num.size() - 1]);

        for (int i = num.size() - 2; i >= 0; i--) {

            printf("%08d", num[i]);

        }

        putchar(‘\n‘);

    }

    int TotalDigit() const {

        int x = num[num.size() - 1] / 10, t = 1;

        while (x) {

            x /= 10;

            t++;

        }

        return t + (num.size() - 1) * Len;

    }

};

const int md = 258280327;

BigInt f[1234];

char s[1000];

void pre_init() {

    f[0] = 0;

    f[1] = f[2] = 1;

    for (int i = 3; i <= 1111; i ++) {

        f[i] = f[i - 1] + f[i - 2];

    }

}

int main() {

#ifndef ONLINE_JUDGE

    freopen("in.txt""r", stdin);

    //freopen("out.txt", "w", stdout);

#endif // ONLINE_JUDGE

    pre_init();

    int T;

    cin >> T;

    while (T --) {

        int n;

        cin >> n;

        scanf("%s", s);

        BigInt buf(s);

        int L = 1, R = 1111;

        while (L < R) {

            int M = (L + R) >> 1;

            if (f[M] > buf + 1) R = M;

            else L = M + 1;

        }

        ((buf - f[L - 2]) % md).show();

    }

    return 0;

}

时间: 2024-10-12 00:39:12

[hdu5351]找规律,大整数模板的相关文章

[带符号大整数模板]vector版

1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 6 using namespace std; 7 8 typedef vector<int> vi; 9 typedef long long LL; 10 11 12 const int maxI = 1e8; 13 const int Len = 8; 14 15 struct

C/C++:大整数模板

写文件管理的时候看到书上的Demo代码居然是用qunit64写的...坑爹啊,文件大小表示居然用qunit64,太不严谨了吧,想了下还是写了这个东西,本来想写浮点的,后来想下算了还蛮复杂的,先用着吧.稍微测试了一下感觉还行,可能有BUG,如果发现了还望告诉我 1 #pragma once 2 #ifndef BigIntNums_H 3 #define BigIntNums_H 4 5 #include <vector> 6 #include <iostream> 7 #inclu

大整数模板(+ - * / == &lt;)

#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include <vector> #include <string> #include <iostream> using namespace std; typedef long long ll; const int ten[4] = {1,1

Acdream 1210 Chinese Girls&#39; Amusement(大数模板运算 + 找规律)

传送门 Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You must have heard that the Chinese culture is quite different from that of Europe or Rus

vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)

P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 格式 输入格式 一个数n 输出格式 m,表示最后有m盏是亮着的 例子1 例子输入1[复制] 5 例子输出1[复制] 2 限制 1s 提示 范围:40%的数据保证,n<=maxlongint 100%的数据保证,n<=

vijos - P1447开关灯泡 (大数模板 + 找规律 + 完全数 + python)

P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描述 一个房间里有n盏灯泡,一开始都是熄着的,有1到n个时刻,每个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 格式 输入格式 一个数n 输出格式 m,表示最后有m盏是亮着的 样例1 样例输入1[复制] 5 样例输出1[复制] 2 限制 1s 提示 范围:40%的数据保证,n<=maxlongint 100%的数据保证,n<=10^

Pollard-Rho大整数拆分模板

随机拆分,简直机智. 关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC8QkZZqmiDIxvgFePUzFJ1KF1G5xVVAoUZpxdw9GN-S46eVeiJ6Q-zXdei 看完后,觉得随机生成数然后和n计算gcd,可以将随机的次数根号一下.思想很叼. 对于里面说的birthday trick,在执行次数上我怎么看都只能减一半.只是把平均分布,变成了靠近0

hdu5351(2015多校5)--MZL&#39;s Border(打表,,找规律)

题目链接:点击打开链接 题目大意:给出b1 = 'b' , b2 = 'a' , bi = b(i-1)b(i-2),将i-1和i-2链接起来,记录一个串的s[1-i] 和s[n-i+1-n]相同的话 Border,当i为最长是为LBorder,现在给让求在bn这个串上的前m个字符组成的子串的LBorder 通过计算可以发现,b字符串的前缀都是相同的,所以只要求出m的LBorder就行,和n是无关的,打表找出规律,找出对应不同的m,LBorder的值,因为存在大数,用java写 dp[i]第i层

找规律 2015百度之星资格赛 1001 大搬家

题目传送门 1 /* 2 找规律:题目真心读不懂,排列组合的题目 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 using namespace std; 9 10 typedef long long ll; 11 12 const int MAXN = 1e6 + 10; 13 const int INF = 0x3f3