E. Power Board 题解(思维)

题目链接

题目思路

假如有\(x,y\)行出现了相同的元素那么他们的都可以表示为\(x^a\)

那么只有类似下面这些行才有交集

\(2,4,8,16....\)

\(3,9,27...\)

\(5,25,125...\)

\(6,36...\)

类似于分组,每组最多\(20\)行,对于每组求\(ans\)相加即可

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n,m;
int f[maxn];
bool tmp[20*maxn],vis[maxn];
int cal(int a,int b){
    memset(tmp,0,sizeof tmp);
    for(int i=1;i<=a;i++){
        for(int j=1;j<=b;j++){
            tmp[i*j]=1;
        }
    }
    int ans=0;
    for(int i=1;i<=a*b;i++){
        ans+=tmp[i];
    }
    return ans;
}
signed main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=20;i++){
        f[i]=cal(i,m);
    }
    ll pr=1;
    for(int i=2;i<=n;i++){
        if(vis[i]) continue;
        int cnt=0;
        for(ll j=i;j<=n;j*=i){
            if(vis[j]) continue;
            vis[j]=1;
            cnt++;
        }
        pr+=f[cnt];
    }
    printf("%lld\n",pr);
    return 0;
}

posted @ 2022-03-08 00:05  hunxuewangzi  阅读(59)  评论(0编辑  收藏  举报