n個數字裏必須有連續m個數的和爲質數
例如(12,1)就必須由12個質數組成
n<=12,m<=4
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int ans[30][30],res,n,m;
int prime[13]={2,3,5,7,11,13,17,19,23,29,31,1000};
int tem[15];
int pos[40];
void init()
{
for(int i=0,j=0;i<=36;i++)
{
while(i>prime[j]) j++;
pos[i]=j;//和爲i的值在prime數組裏佔的位置
}
}
void dfs(int cur,int sum)
{
if(cur==n)
{
res++;
return ;
}
if(cur<m-1)
for(int i=0;i<10;i++)
{
tem[cur+1]=i;
dfs(cur+1,sum+i);
}
else
for(int i=pos[sum];prime[i]<=sum+9;i++)//找出每一個能組成質數的下一個數
{
tem[cur+1]=prime[i]-sum;
dfs(cur+1,prime[i]-tem[cur-m+2]);//刪去前一個數,使總和一直保持在m-1個數的和
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
init();
for(n=1;n<=12;n++)
for(m=1;m<=min(n,4);m++)
{
res=0;
dfs(0,0);
ans[n][m]=res;
}
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
cout<<ans[n][m]<<endl;
}
return 0;
}
這代碼是參考某大腿隊友寫的…我還是太弱了….