输入:a b
求ab之间偶数分解为两个素数。
比如10=3+7/5+5。12=5+7。14=1+13/7+7
求ab之间偶数分解为两个素数。
比如10=3+7/5+5。12=5+7。14=1+13/7+7
则输出2*1*2行数据。
3 1 7 1
5 2
5 1 7 1
1 1 13 1
7 2
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <vector>
using namespace std;
int p[1000];
int vis[1100];
int p_num=0;
void prime(){
for(int i=2;i<=50;i++){
if(!vis[i])
p[++p_num]=i;
for(int j=i+i;j<=50;j+=i)
vis[j]=1;
}
}
int ans=0;
int vec[5000][500];
int number[5000];
void dfs(int index,int num,int cnt){
if(num==0)
{
number[ans]=cnt;
ans++;
return ;
}
int flag=ans;
for(int i=index;i<=p_num;i++){
if( num-p[i]>=0 ){
if(flag!=ans)
for(int k=1;k<=cnt;k++)
vec[ans][k]=vec[ans-1][k];
vec[ans][cnt+1]=p[i];
dfs(i,num-p[i],cnt+1);
}
else return ;
}
}
struct node{
int num;
int val;
}nd[55];
bool cmp(node x,node y){
return x.num>y.num;
}
int main()
{
prime();
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(i%2) continue;
dfs(1,i,0);
cout<<ans<<endl;
for(int k=0;k<ans;k++){
for(int j=0;j<=55;j++)
nd[j].val=j,nd[j].num=0;
for(int j=1;j<=number[k];j++)
nd[ vec[k][j] ].num++;
sort(nd,nd+51,cmp);
for(int j=0;nd[j].num!=0;j++){
if(j!=0) cout<<" ";
cout<<nd[j].val<<" "<<nd[j].num;
}
cout<<endl;
}
memset(number,0,sizeof(number));
memset(vec,0,sizeof(vec));
ans=0;
cout<<" ------------"<<endl;
}
return 0;
}