题目链接
题目思路
假如有\(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;
}