题解 P5589 【小猪佩奇玩游戏】
题解-小猪佩奇玩游戏
一道似乎用水过的题目,然而比赛却只有
还是太菜了。
反正我是手模
的答案。然后发现大多数数的贡献都是
少数是
。但是看看样例怎么会有
这些神奇的小数。于是大胆猜想是不是与这个数
等于多少个
,于是就有了
的好成绩
#include <bits/stdc++.h>
using namespace std;
map<int,int>ma;
double ans[1000005];
inline int ksm(int a,int b) {
int ret=1;
while(b) {
if(b&1) ret=ret*a;
a=a*a;
b>>=1;
}
return ret;
}
int main() {
int T;
for ( int i=2;i<=100;i++ )
for ( int j=2;j<=40;j++ ) {
int s=ksm(i,j);
if(s>100000||s<0) break;
ma[s]+=1;
}
ans[1]=1;
for ( int i=2;i<=100000;i++ )
ans[i]=ans[i-1]+(1/(1.0*(ma[i]+1)));//预处理答案
scanf("%d",&T);
for ( int i=1;i<=T;i++ ) {
int x;
scanf("%d",&x);
printf("%.8lf\n",ans[x]);
}
return 0;
}
比赛比完我听
巨佬说他的暴力倒着写就是正解
其实现在的方法更简单。先用
存储
数然后遍历
就可以了。最后再加上某些为
贡献的数就可以了。
#include <bits/stdc++.h> using namespace std; #define int long long int n,T; map<int,int> ma; signed main() { scanf("%lld",&T); while(T--) { scanf("%lld",&n); ma.clear(); for ( int i=2;i*i<=n;i++ ) for ( int j=i*i;j<=n;j*=i ) ma[j]++; double ans=0; ans=n-ma.size(); for ( auto i:ma ) ans+=1.0/(i.second+1); printf("%.8lf\n",ans); } return 0; }
科大讯飞公司氛围 472人发布
查看3道真题和解析