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;
}