JZOJ 5163. 【NOIP2017模拟6.25】PS的烦恼
Description
話說PS總是有著各種各樣的煩惱,這天,他又在為自己失敗的感情史煩惱著。這時,他心中的女神,魔法少女小圓從天而降,她對他說,如果你能幫我解決一個問題,我就讓你永遠沒有煩惱。
問題是這樣的:
尋找一個最大的k,使得存在一個x使得x^k=y,那么f(y)=k,即y最多可以開k次方根。
小圓的要求是求出從a到b的f值之和(包括a和b)。
Input
多組數(shù)據(jù),每組數(shù)據(jù)一行包含兩個數(shù)a,b,文件以0 0(不需要輸出)結(jié)尾。
Output
每組數(shù)據(jù)一行表示這一段f值之和。
Sample Input
2 10
248832 248832
0 0
Sample Output
13
5
Data Constraint
30%的數(shù)據(jù)滿足:a<=1000 b<=1000
100%的數(shù)據(jù)滿足:2<=a<=b<=10^18
Solution
又是一道數(shù)論題。考慮將問題轉(zhuǎn)化:不妨將題目轉(zhuǎn)化為 N 以內(nèi)每個數(shù)最大開方次數(shù) 累加和。
設(shè)從 1 到 N 的答案為 Get(N) ,則本題答案即為:Get(B)?Get(A?1) 。
再設(shè) Fi 為最大開 i 次方的數(shù)的個數(shù), Gi 為至少能開 i 次方的數(shù)的個數(shù)。
則有:Gi=N??√i?1
Fi=Gi?∑j=2?60i?Fi?j(“至少有的” 減去 “只有的”)&(“1”不計數(shù),所以要減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位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的JZOJ 5163. 【NOIP2017模拟6.25】PS的烦恼的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 3766. 【BJOI2014
- 下一篇: JZOJ 5167. 【NOIP2017