#include<bits/stdc++.h>
using namespace std;
#define N 505
struct node
{
int p,v;
bool operator < (const node &x) const
{
return v>x.v;
}
}a[N];
int n,m,k,cnt,x,y;
map<int,int> mp;
multiset<int> s;
vector<int> g[N];
int main()
{
scanf("%d%d",&n,&k);
mp[n-1]=n;
for(int i=1;i<=n;i++)
s.insert(n-1);
for(int i=n-k;i<n;i++)
{
if(mp[i])
continue;
while(s.size()>1&&*s.begin()>i)
{
auto it1=s.begin(),it2=s.end();
x=*it1,y=*(--it2);
s.erase(it2);
if(mp[y]==1)
continue;
s.erase(it1);
s.insert(x-1);
s.insert(y-1);
mp[x]--,mp[y]--;
mp[x-1]++,mp[y-1]++;
}
}
if(!mp[n-k])
{
printf("NO\n");
return 0;
}
for(auto i:mp)
{
x=i.first,y=i.second;
while(y--)
{
cnt++;
a[cnt]=node{cnt,x};
}
}
for(int i=1;i<=n;i++)
{
sort(a+1,a+n+1);
for(int j=2;j<=a[1].v+1;j++)
{
g[a[1].p].push_back(a[j].p);
m++,a[j].v--;
}
a[1].v=0;
}
printf("YES\n%d\n",m);
for(int i=1;i<=n;i++)
{
for(auto j:g[i])
printf("%d %d\n",i,j);
}
return 0;
}
大概就是每次选两个度数减 1,求 hack