jzoj2700-数字【数论,LCM】
正題
luogu題目鏈接:https://www.luogu.org/problemnew/show/P4193
題目大意
定義一個函數D(x)D(x)D(x)和S(x)S(x)S(x),S(x)S(x)S(x)表示xxx的各位之和
D(n)={D(S(n)),S≥10S(n)D(n)=\left\{\begin{matrix} \\D(S(n)),S\geq 10 \\S(n) \\ \\ \end{matrix}\right.D(n)=????????D(S(n)),S≥10S(n)?
求L~RL\sim RL~R之間有多個xxx滿足x=D(k)?kx=D(k)*kx=D(k)?k
解題思路
因為(n?S(n))mod9=0(n-S(n))\ mod\ 9=0(n?S(n))?mod?9=0,所以D(n)=(n?1)mod9+1D(n)=(n-1)\ mod\ 9+1D(n)=(n?1)?mod?9+1
22680modx=0(x∈[1..9])22680\ mod\ x=0(x\in [1..9])22680?mod?x=0(x∈[1..9])
若一個數n=D(k)?kn=D(k)*kn=D(k)?k,那么n+22680=(k+22680D(k))?D(k)n+22680=(k+\frac{22680}{D(k)})*D(k)n+22680=(k+D(k)22680?)?D(k)
證明:
(k+22680D(k))?D(k)?k?D(k)=22680(k+\frac{22680}{D(k)})*D(k)-k*D(k)=22680(k+D(k)22680?)?D(k)?k?D(k)=22680
(k+22680D(k)?k)?D(k)=22680(k+\frac{22680}{D(k)}-k)*D(k)=22680(k+D(k)22680??k)?D(k)=22680
(k+22680D(k)?k)?D(k)=22680(k+\frac{22680}{D(k)}-k)*D(k)=22680(k+D(k)22680??k)?D(k)=22680
k?D(k)+22680?k?D(k)=22680k*D(k)+22680-k*D(k)=22680k?D(k)+22680?k?D(k)=22680
22680=2268022680=2268022680=22680
證畢
然后之間根據循環節預處理1~226801\sim 226801~22680的就好了
codecodecode
#include<cstdio> #define LCM 22680 #define ll long long using namespace std; ll n,f[1000000],ans; ll D(ll x) {return (x-1)%9+1;} ll ask(ll x)//1~x的個數 {return x/LCM*ans+f[x%LCM];} int main() {scanf("%lld",&n);for(ll i=1;i<=LCM;i++)//預處理{for(ll j=1;j<=9;j++)if(D(i/j)==j&&i%j==0){f[i]=1;ans++;break;}f[i]+=f[i-1];}while(n--){ll l,r;scanf("%lld%lld",&l,&r);printf("%lld\n",ask(r)-ask(l-1));} }總結
以上是生活随笔為你收集整理的jzoj2700-数字【数论,LCM】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏电脑配置推荐2022(游戏电脑配置推
- 下一篇: jzoj3511-cza的蛋糕【状态压缩