JZOJ 5163. 【NOIP2017模拟6.25】PS的烦恼
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 5163. 【NOIP2017模拟6.25】PS的烦恼
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
話說PS總是有著各種各樣的煩惱,這天,他又在為自己失敗的感情史煩惱著。這時,他心中的女神,魔法少女小圓從天而降,她對他說,如果你能幫我解決一個問題,我就讓你永遠沒有煩惱。
問題是這樣的:
尋找一個最大的k,使得存在一個x使得x^k=y,那么f(y)=k,即y最多可以開k次方根。
小圓的要求是求出從a到b的f值之和(包括a和b)。
Input
多組數據,每組數據一行包含兩個數a,b,文件以0 0(不需要輸出)結尾。
Output
每組數據一行表示這一段f值之和。
Sample Input
2 10
248832 248832
0 0
Sample Output
13
5
Data Constraint
30%的數據滿足:a<=1000 b<=1000
100%的數據滿足:2<=a<=b<=10^18
Solution
又是一道數論題。考慮將問題轉化:不妨將題目轉化為 N 以內每個數最大開方次數 累加和。
設從 1 到 N 的答案為 Get(N) ,則本題答案即為:Get(B)?Get(A?1) 。
再設 Fi 為最大開 i 次方的數的個數, Gi 為至少能開 i 次方的數的個數。
則有:Gi=N??√i?1
Fi=Gi?∑j=2?60i?Fi?j(“至少有的” 減去 “只有的”)&(“1”不計數,所以要減1),從后往前推即可得到 Fi 。
于是答案即為: ∑Fi?i 。
Code
#include<cstdio> #include<cmath> using namespace std; typedef long long LL; LL a,b; LL f[61],g[61]; inline LL get(LL x) {g[1]=x-1;for(int i=2;i<=60;g[i++]--){g[i]=exp(log(x)/i);if(pow(g[i],i)>x) g[i]--;}LL sum=0;for(int i=60;i;i--){f[i]=g[i];for(int j=60/i;j>1;j--) f[i]-=f[i*j];sum+=f[i]*i;}return sum; } int main() {while(scanf("%lld%lld",&a,&b),a+b)printf("%lld\n",get(b)-get(a-1));return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的JZOJ 5163. 【NOIP2017模拟6.25】PS的烦恼的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 3766. 【BJOI2014
- 下一篇: JZOJ 5167. 【NOIP2017