CF468C 【Hack it!】

首先有一个性质,对于\(1\le x< 10^{18}\)\(f(x+10^{18})=f(x)+1\)

可以注意到:

\[\sum_{i=1}^{10^{18}-1}f(i)=x(~mod~~a~ ) \]

于是就有:

\[\sum_{i=1}^{10^{18}}f(i)=\sum_{i=1}^{10^{18-1}}+f(0+10^{18})-f(0)=x+1(~~mod~~a ~~) \]

同样也可以得到:

\[\sum_{i=t}^{10^{18}-1+t}f(i)=x+t(~mod~~a~) \]

假设 \(x=0\),那么直接输出 \(1\)\(10^{18}-1\)

否则可以想到 \(t=a-x\)

然后直接输出 \(l=t\)\(r=10^{18}-1+t\) 即可

于是问题的关键就在于\(\sum_{i=0}^{10^{18}-1}f(i)\)是多少了

下面给出简略证明

可以发现每一个数位贡献的次数是固定的,可以考虑将\(10^{18}-1\)看作是\(18\)个格子,然后放入一些数字,求所有方案放入的数字和

于是可以枚举一个数\(0\le x\le 9\)来计算其贡献次数

可以考虑其恰好出现 \(i\) 次时的答案,那么可以枚举\(i\)个位置选入这个数\(x\),然后接下来\(18-i\)个位置都可以放入除了\(x\)之外的所有数,所以有其贡献次数为:

\[i\times \dbinom{i}{18}\times 9^{18-i} \]

所以答案就是:

\[\sum_{x=0}^9x\times \sum_{i=0}^{18}i\times \dbinom{i}{18}\times 9^{18-i} \]

\[45\times \sum_{i=0}^{18}i\times \dbinom{i}{18}\times 9^{18-i} \]

\[45\times \sum_{i=0}^{18}i\times \dfrac{18!}{i!(18-i)!}\times 9^{18-i} \]

\[45\times \sum_{i=1}^{18} \dfrac{18\times 17!}{(i-1)!((18-1)-(i-1))!}\times 9^{(18-1)-(i-1)} \]

\[18\times45\times \sum_{i=0}^{17} \dfrac{17!}{i!(17-i)!}\times 9^{17-i} \]

\[18\times45\times \sum_{i=0}^{17} \dbinom{17-i}{17} 9^{17-i} \]

\[18\times45\times10^{17} \]

\[9\times 9\times 10^{18} \]

#include<bits/stdc++.h>
using namespace std ;
#define rep( i, s, t ) for( register int i = s; i <= t; ++ i )
#define re register
#define int long long
int gi() {
	char cc = getchar() ; int cn = 0, flus = 1 ;
	while( cc < '0' || cc > '9' ) {  if( cc == '-' ) flus = - flus ; cc = getchar() ; }
	while( cc >= '0' && cc <= '9' )  cn = cn * 10 + cc - '0', cc = getchar() ;
	return cn * flus ;
}
int P = 1e18, l, r ;
signed main()
{
	int A = gi() ; 
	l = A - ( ( P % A ) * 9 % A * 9 ) % A, r = l + P - 1 ;
	printf("%lld %lld", l, r ) ;
	return 0 ;
}

qwq

posted @ 2019-10-15 19:02  Soulist  阅读(266)  评论(0)    收藏  举报