|
发表于 2022-1-9 10:49:17
|
显示全部楼层
本帖最后由 guosl 于 2022-1-9 11:05 编辑
从这题开始,有一些列的题目都牵涉到了连分数,连分数的内容可以参考《初等数论》(闵嗣鹤 严士健编)一书。
对于一个连分数[a1,a2,...ak...],若假设p(k)/q(k)为其的第k个渐进分数,则有:
p(1)=a1,p(2)=a2*a1+1,...,p(k)=ak*p(k-1)+p(k-2),...
q(1)=1,q(2)=a2,...,q(k)=ak*q(k-1)+q(k-2),...
对于本题则连分数为:[1,2,...,2,...]是一个无限循环的连分数。套用前面给出的公式再结合mpir库,本题就非常简单了。
- /*
- 答案:153
- */
- #include <iostream>
- #include <string>
- #include <mpirxx.h>
- using namespace std;
- int main(void)
- {
- mpz_class p0 = 1, p1 = 3, p2;
- mpz_class q0 = 1, q1 = 2, q2;
- int nCount = 0;
- for (int i = 2; i <= 1000; ++i)
- {
- p2 = 2 * p1 + p0;
- q2 = 2 * q1 + q0;
- string sp = p2.get_str();
- string sq = q2.get_str();
- if (sp.length() > sq.length())
- ++nCount;
- p0 = p1;
- p1 = p2;
- q0 = q1;
- q1 = q2;
- }
- cout << nCount << endl;
- return 0;
- }
复制代码 |
|