• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

「Codeforces 468C」Hack it!

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Description

定义 \(f(x)\) 表示 \(x\) 的各个数位之和。现在要求 \(\sum_{i=l}^rf(i)\bmod a\)

显然 ans=solve(l,r)%a; if(ans<=0) ans+=a; 会在 \(\sum_{i=l}^rf(i)\equiv 0\pmod a\) 时输出错误。给定 \(a\),请你构造一个 Hack 数据。

\(1\leq a\leq 10^{18}\),构造出的 \(l,r\) 需满足 \(1\leq l\leq r\leq 10^{200}\),同时 \(\sum_{i=l}^rf(i)\bmod a=0\)

Solution

定义 \(g(x)=\sum_{i=1}^xf(i)\),则 \(\sum_{i=l}^rf(i)=g(r)-g(l-1)\)

首先可以发现,对于 \(1\leq x<10^{18}\),有:

\(\displaystyle f(x+10^{18})-f(x)=1\)

也就是说,当 \([l,r]\)\([x+1,x+10^{18}]\) 变成 \([x+2,x+10^{18}+1]\) 时(整体增大 \(1\)),由于 \(f(x+10^{18}+1)-f(x+1)=1\),因此结果会增加 \(1\)

那么,当 \([l,r]\)\([1,10^{18}]\) 变成 \([x+1,x+10^{18}]\) 时(整体增大 \(x\)),结果会增加 \(x\)。即:

\(\displaystyle \sum_{i=k+1}^{k+10^{18}}\equiv g(10^{18})+k\pmod a\)

\(g(10^{18})\equiv x\pmod a\),取 \(k=a-x\),那么:

\(\displaystyle \sum_{i=a-x+1}^{a-x+10^{18}}\equiv 0\pmod a\)

则可取 \([l,r]\)\([a-x+1,a-x+10^{18}]\)。考虑如何求出 \(x\)

不难发现,\(g(10^x)=45\times x\times 10^{x-1}+1\)。所以 \(g(10^{18})=45\times 18\times 10^{17}+1\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,x;
signed main(){
    scanf("%lld",&a),x=1ull*((int)1e17%a*45%a*18%a+1)%a;
    printf("%lld %lld\n",a-x+1,a-x+(int)1e18);
    return 0;
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
linux:C++实现ping发布时间:2022-07-14
下一篇:
C#Lpt端口打印类的操作浅析发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap