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