P11310 无穷的迭代器

P11310 无穷的迭代器 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这不是正解,模拟是会爆 long long 的,这题模拟的正确性是找奇偶性,正常+-* 运算溢出了不影响奇偶性。最后还是找奇偶性的所以爆了没影响,凡是模拟的代码试试这个,输出中间值。会有负数。

1
1000000000000000000

19

感觉挺好一题。当然不确定是否有一个情况使得 long long 中间运算时为 0。如果有,这个方法也就错了(当然,我估计是不可能有这种情况的)。

为什么用 int 会错?首先用 cin 输入的时候是不会溢出的,如果超出限制会直接赋值最大或者最小。所以用 scanf,或者另存赋值。其次,int 对于某些数(开始时),溢出后为 0,如果为 0,后面也就不可能对了。所以会 TLE,或者 WA。最后一个测试点应该就是这种情况。

还有使用 int128 并不会错。记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
使用 int,如果溢出不为 0 的话也可以过。记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

如:

1
4294967296

33

如果是从这方面考虑的话,这题其实还挺好的。

模拟代码

#include <iostream>

using namespace std;

typedef long long LL;

LL n, m;

int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        cin >> n;
        if (n == 0) puts("NO!");
        else 
        {
            int cnt = 1;
            while ((n + 1) & 1) // 只关注奇偶性
            {
                n = n / 2 + n * (n + 1); // 即使,溢出奇偶性不变。
                cnt ++ ;
                if (cnt > 100) break;
            }
            if (cnt > 100) puts("NO!");
            else cout << cnt << endl;
        }
    }
    return 0;
}
posted @ 2024-11-23 21:14  blind5883  阅读(11)  评论(0编辑  收藏  举报