“即时取模”的快读 → 数论

【“即时取模”的快读】
“即时取模”的快读是一种在输入大整数时直接进行取模运算的优化技术,常用于处理需要大数运算但最终结果需取模的场景(如数论题目)。其核心思想是在逐位读取数字时同步计算模值,避免存储完整的大数。

int read() { //fast read
    int x=0,f=1;
    char c=getchar();
    while(c<'0' || c>'9') { //!isdigit(c)
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0' && c<='9') { //isdigit(c)
        x=(x*10LL+c-'0')%MOD;
        c=getchar();
    }
    return x*f;
}

●  “即时取模”快读的数学原理:(a×10+b) mod m=((a mod m)×10+b) mod m
证明:设 a=km+r,其中 r=a mod m(即0≤r<m),k为整数。
则左式 (a×10+b) mod m=((km+r)×10+b) mod m=(km×10+r×10+b) mod m=(r×10+b) mod m。
而右式 ((a mod m)×10+b) mod m=(r×10+b) mod m。
左右两式均等于(r×10+b)mod m,等式成立。得证。

● “即时取模”快读的优势

无需高精度存储,时间复杂度为O(n)。其中,n为数字位数。

● “即时取模”的快读,在洛谷 P2613(
https://blog.csdn.net/hnjzsyjyj/article/details/148008443)中有应用。

------------------------------------------------------------------------------------------------------

【传统的快读】→ 
https://blog.csdn.net/hnjzsyjyj/article/details/120131534
● 算法竞赛‌中,处理 ‌1e6 及以上‌个整数输入时,使用“快读”可显著减少输入时间,避免超时。

int read() { //fast read
    int x=0,f=1;
    char c=getchar();
    while(c<'0' || c>'9') { //!isdigit(c)
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0' && c<='9') { //isdigit(c)
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}


 

### C++ 中实现输入的方法 在处理大规数据时,C++ 的标准输入方法 `cin` 可能会成为性能瓶颈。为了提升效率,可以采用以下几种优化技术: #### 1. 解除 `cin` 和 `cout` 的绑定 默认情况下,`cin` 和 `cout` 是同步的,即每次执行 `cin` 操作时都会刷新 `cout` 缓冲区。这会影响性能,尤其是在频繁交互的情况下。可以通过调用 `std::ios::sync_with_stdio(false)` 来解除这种绑定关系[^4]。 ```cpp #include <iostream> int main() { std::ios::sync_with_stdio(false); // 关闭同步 int a, b; std::cin >> a >> b; std::cout << (a + b); return 0; } ``` #### 2. 禁用 `cin` 自动刷新 `cout` 除了关闭同步外,还可以通过设置 `cin.tie(NULL)` 进一步减少不必要的开销。这种方法能够防止每次 `cin` 调用时都自动刷新 `cout` 缓存。 ```cpp #include <iostream> int main() { std::ios::sync_with_stdio(false); std::cin.tie(NULL); // 禁止 cin 刷新 cout int a, b; std::cin >> a >> b; std::cout << (a + b); return 0; } ``` #### 3. 使用 C 风格的 I/O 函数 相比 C++ 的流式输入输出 (`cin`, `cout`),C 风格的函数如 `scanf` 和 `printf` 更加高效。它们直接操作底层缓冲区而不涉及额外的类型检查和格式化逻辑[^2]。 ```cpp #include <cstdio> int main() { int a, b; scanf("%d %d", &a, &b); // 使用 scanf 提升速度 printf("%d\n", a + b); // 使用 printf 输出结果 return 0; } ``` #### 4. 实现自定义板 对于更高需求的情况,可以编写自己的函数来进一步加速输入过程。这种方式绕过了标准库中的复杂机制并专注于核心功能[^3]。 ```cpp inline void fast_read(int &x) { char ch = getchar(); bool neg = false; x = 0; while (!isdigit(ch)) { if (ch == '-') neg = true; ch = getchar(); } while (isdigit(ch)) { x = x * 10 + (ch ^ '0'); ch = getchar(); } if (neg) x = -x; } int main() { int a, b; fast_read(a); fast_read(b); printf("%d\n", a + b); return 0; } ``` 以上四种方法都可以有效改善 C++ 程序中输入部分的时间消耗问题。具体选择哪种决于实际应用场景以及个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值