【CodeForces468】C. Hack it!(构造)

传送门


题解:

由于我校模拟考的时候 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=010k1f(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 ap9ek 的时候, ∑ 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=ap10k+ap1f(i)0(moda)

该做法在 a ≤ 9 × 1 0 k a\leq 9\times 10^k a9×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 ap(10t)×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;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值