日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj2700-数字【数论,LCM】

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)),S10S(n)?
L~RL\sim RLR之間有多個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 22680122680的就好了


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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。