Description
从
1
到
Input
第一行一整数
Output
对于每组用例,输出方案数,结果模 109+7
Sample Input
2
4 2
6 4
Sample Output
6
19
Solution
对于所选的
k
个数,大于
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
#define maxn 505
#define mod 1000000007
int p[]={2,3,5,7,11,13,17,19};
int T,n,k,a[maxn],sta[maxn],dp[maxn][maxn];
vector<int>v[maxn];
void inc(int &a,int b)
{
a=a+b>=mod?a+b-mod:a+b;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)v[i].clear(),sta[i]=0;
for(int i=1;i<=n;i++)
{
a[i]=i;
for(int j=0;j<8;j++)
if(a[i]%(p[j]*p[j])==0)sta[i]=-1;
else if(a[i]%p[j]==0)a[i]/=p[j],sta[i]|=(1<<j);
}
for(int i=1;i<=n;i++)
if(~sta[i])
{
if(a[i]==1)v[i].push_back(i);
else v[a[i]].push_back(i);
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;i++)
if(~sta[i]&&v[i].size())
for(int j=k-1;j>=0;j--)
for(int s=0;s<256;s++)
for(int l=0;l<v[i].size();l++)
{
int t=sta[v[i][l]];
if(s&t)continue;
inc(dp[j+1][s|t],dp[j][s]);
}
int ans=0;
for(int i=1;i<=k;i++)
for(int j=0;j<256;j++)
inc(ans,dp[i][j]);
printf("%d\n",ans);
}
return 0;
}