传送门
题解:
由于我校模拟考的时候 l , r , a l,r,a l,r,a 的限制为 1e16,所以这里讲一种把 l , r l,r l,r 往小了放的方法。
首先问题转化为找到两个前缀使得答案 % a \%a %a 相等,根据抽屉原理问题一定有解。
容易注意到 f ( x + y ) = f ( x ) + f ( y ) f(x+y)=f(x)+f(y) f(x+y)=f(x)+f(y) 当且仅当 x + y x+y x+y 没有进位。
容易想到把其中一个后面若干位设置成 0 0 0,这样可以任意放。
那么考虑求出 ∑ i = 0 1 0 k − 1 f ( i ) ≡ p ( m o d a ) \sum_{i=0}^{10^k-1}f(i)\equiv p\pmod a ∑i=010k−1f(i)≡p(moda)。
对于 x < 9 × 1 0 k , f ( x + 1 0 k ) = f ( x ) + 1 x < 9\times10^k,f(x+10^k)=f(x)+1 x<9×10k,f(x+10k)=f(x)+1,于是不难发现,当 a − p ≤ 9 e k a-p\leq 9ek a−p≤9ek 的时候, ∑ i = a − p 1 0 k + a − p − 1 f ( i ) ≡ 0 ( m o d a ) \sum_{i=a-p}^{10^k+a-p-1}f(i)\equiv 0\pmod a ∑i=a−p10k+a−p−1f(i)≡0(moda)。
该做法在 a ≤ 9 × 1 0 k a\leq 9\times 10^k a≤9×10k 的时候必然出解。
当然还可以枚举上标为 t × 1 0 k t\times10^k t×10k,则 a − p ≤ ( 10 − t ) × 1 0 k a-p\leq (10-t)\times 10^k a−p≤(10−t)×10k 的时候可以找到一组解,不过原题限制很宽松,你甚至可以直接考虑 k = 18 k=18 k=18。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
using std::cerr;
using std::cout;
ll a;
ll pw[20];
void Main(){
std::cin>>a;
for(int re i=pw[0]=1;i<=18;++i)
pw[i]=pw[i-1]*10;
for(int re k=1;k<=18;++k){
ll p=pw[k-1]%a*k%a*45%a;
ll l=a-p,r=pw[k]+a-p-1;
if(l>=0&&l/9<=pw[k]){
cout<<l<<" "<<r<<"\n";
return ;
}
}cout<<"fuck\n";
}
inline void file(){
#ifdef zxyoi
freopen("hack.in","r",stdin);
#else
#ifndef ONLINE_JUDGE
freopen("hack.in","r",stdin);
freopen("hack.out","w",stdout);
#endif
#endif
}signed main(){file();Main();return 0;}