Loading... ## 题意 定义函数 $f(x)$ 为 $x$ 的各个数位之和。给定 $a$ 构造 $l,r$ 使得 $\sum_{i=l}^rf(i)\equiv 0 \pmod a$。 $a\leq 10^{18},1\leq l\leq r\leq 10^{200}$ ## 题解 非常巧妙的构造,我们记 $B=10^{18},g(l,r)=\sum_{i=l}^rf(i) \bmod a$。 首先对于任意 $x\leq B$, $f(x)+1=f(x+B)+1$。记 $p=g(0,B-1)$,考虑计算 $g(1,B)$: $$ \begin{align} &g(1,B)\\ =&p-f(0)+f(B+0)\\ =&p+1 \end{align} $$ 同理对于任意 $i\leq B$,考虑计算 $g(x,B+x-1)$: $$ \begin{align} &g(x,B+x-1)\\ =&p+\sum_{i=0}^{x-1} f(x+B)-f(x)\\ =&p+x \end{align} $$ 然后就很简单了,可以用各种方法把 $p$ 算出来,这里直接给出 $p=81\times 10^{18}$,然后求出 $x\equiv -p \pmod a$ 就做完了。 ```cpp #include<bits/stdc++.h> // #define ONLINE_JUDGE #define INPUT_DATA_TYPE long long #define OUTPUT_DATA_TYPE long long inline __attribute((always_inline)) INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){if(x<0)x=-x,putchar('-');if(x>9)print(x/10);putchar(x%10^48);return;} int main(){ #ifndef ONLINE_JUDGE freopen("name.in", "r", stdin); freopen("name.out", "w", stdout); #endif long long a=read(); long long p=((long long)1e18)%a*9%a*9%a; long long l=a-p; long long r=((long long)1e18)+a-p-1; print(l),putchar(' '),print(r); #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; } ``` 最后修改:2024 年 04 月 22 日 © 允许规范转载 赞 如果觉得我的文章对你有用,使用点这里使用虚拟货币进行赞赏