题解 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;
    }
全部评论

相关推荐

Kalvinix:对的, 兄弟对的
投递美团等公司6个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务