【2017 BSUIR Semifinal G】Digital characteristic 题解
題目大意
??定義函數 f(n)f(n)f(n) 表示對 nnn 一直求數位和直至 nnn 為個位數,即:
f(n)={nn<10,f(g(n))otherwise,f(n)=\begin{cases} n&n<10, \\ f(g(n))&\text{otherwise,} \end{cases} f(n)={nf(g(n))?n<10,otherwise,?
??其中 g(n)g(n)g(n) 表示 nnn 的數位和。
??現在有一個很大的 nnn,你要求 f(n)f(n)f(n)。
??這個 nnn 是根據四個參數 a,b,m,ka,b,m,ka,b,m,k 生成的,首先生成 kkk 個數 a,a+b,a+2b,?,a+(k?1)ba,a+b,a+2b,\cdots,a+(k-1)ba,a+b,a+2b,?,a+(k?1)b(都在 modm\bmod~mmod?m 意義下),然后把它們從后往前拼起來,就是 nnn。比如,a=42,b=42,m=2018,k=18a=42,b=42,m=2018,k=18a=42,b=42,m=2018,k=18,會生成 n=7567146726305885465044624203783362942522101681268442n=7567146726305885465044624203783362942522101681268442n=7567146726305885465044624203783362942522101681268442。
??0≤a,b≤109,2≤m≤109+7,1≤k≤1090 \leq a,b \leq 10^9,~~2 \leq m \leq 10^9+7,~~1 \leq k \leq 10^90≤a,b≤109,??2≤m≤109+7,??1≤k≤109
??多測,T≤104T \leq 10^4T≤104
\\
\\
\\
題解
??數論技巧什么的。。還是要時常復習啊。。
??首先這個 fff 是有通項公式的,當 n>0n>0n>0 時 f(n)=(n?1)mod9+1f(n)=(n-1) \bmod 9+1f(n)=(n?1)mod9+1,也即 f(n)=(n%9==0) ?9 :n%9。
??所以我們就是要求 nmod9n \bmod 9nmod9 的值。(特判 n=0n=0n=0)
??注意到 ?x>0,10xmod9=1\forall x>0,10^x \bmod 9=1?x>0,10xmod9=1,因此對于 nnn 來說,多個數拼起來 mod9\bmod 9mod9 等價于拆開來 mod9\bmod 9mod9 再求和,即 nmod9=∑i=0k?1((a+bi)modm)mod9n \bmod 9 =\sum_{i=0}^{k-1}\big((a+bi) \bmod m \big) \bmod 9nmod9=∑i=0k?1?((a+bi)modm)mod9。
??注意到這個式子,是先讓 a+bia+bia+bi 模 mmm,再求和,模 999。這樣子直接做就不好做,所以要把里面的 modm\bmod~mmod?m 變形:
nmod9=∑i=0k?1((a+bi)??a+bim??m)mod9n \bmod 9 =\sum_{i=0}^{k-1}\big((a+bi)-\lfloor \frac{a+bi}{m} \rfloor \cdot m) \bmod 9 nmod9=i=0∑k?1?((a+bi)??ma+bi???m)mod9
??這樣就變成類歐了。
代碼
#include<bits/stdc++.h> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std;typedef long long LL;LL a,b,m,k;LL f(LL a,LL b,LL c,LL n) {if (!a) return (n+1)*(b/c)%9;if (a>=c || b>=c){LL sqr=(n&1) ?(n+1)/2*n :n/2*(n+1) ;sqr%=9;return (f(a%c,b%c,c,n)+(a/c)*sqr+(n+1)*(b/c))%9;} else{LL m=(a*n+b)/c;return (m%9*n%9-f(c,c-b-1,a,m-1)+9)%9;} }int T; int main() {scanf("%d",&T);while (T--){scanf("%lld %lld %lld %lld",&a,&b,&m,&k);a%=m, b%=m;if (a==0 && (k==1 || k>1 && b==0)) {puts("0"); continue;}int ans=((a*k%9+k*(k-1)/2%9*b%9)%9-m*f(b,a,m,k-1)%9+9)%9;printf("%d\n",(ans==0) ?9 :ans);} }總結
以上是生活随笔為你收集整理的【2017 BSUIR Semifinal G】Digital characteristic 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用RGB颜色表
- 下一篇: Python福彩3D单选单复式排列计算器