RT,这题就是第二类斯特林数板子(直接套通项公式),但为什么我 WA #1?
代码在这里:
#include<bits/stdc++.h>
#define int long long
using namespace std;
bitset<10000001> b;
vector<int> p;
int f(int n,int m){
int c=0;
for(int i=0;i<=m;i++){
int s=1;
for(int j=1;j<=n;j++)s*=i;
for(int j=2;j<=i;j++)s/=j;
for(int j=2;j<=m-i;j++)s/=j;
if(m-i&1)c-=s;
else c+=s;
}
return c;
}
main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
for(int i=2;i<1e7;i++){
if(!b[i])p.emplace_back(i);
for(int j:p){
if(i*j>1e7)break;
b[i*j]=true;
if(!(i%j))break;
}
}
int t; cin>>t;
while(t--){
int n,k,c=0; cin>>n>>k;
for(int i:p){
if(i*i>n)break;
if(!(n%i))c++;
while(!(n%i))n/=i;
}
if(n>1)c++;
if(k>c)cout<<"0\n";
else cout<<f(c,k)<<'\n';
}
return 0;
}