约瑟夫问题:公式推导
#include<stdio.h>
int main()
{
int n, m,i,s=0;
scanf("%d%d",&n,&m);
for(i=2;i<=n;i++)
s=(s+m)%i;
printf("%d", s+1);
return 0;
}
又遇约瑟夫
1.
#include<stdio.h>
int main()
{
int n,m,rest,now;
int sign[15]={0};
while(~scanf("%d",&n),n)
{
if(sign[n]==0)
{ m=0;
while(1)
{ m++;
now=0;
rest=2*n ;
while(1)
{
now=(now+m-1)%rest+1 ;
if(now>n)
{rest--;now--;}
else break;
}
if(rest == n)
{
sign[n] = m;
break;
}
}
}
printf("%d\n",sign[n]);
}
return 0;
}
2.
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cmath>
#include<vector>
#include<cstring>
#include<string>
#include<iostream>
#include<iomanip>
#define mset(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int mod=9973;
const int N=100006;
const int inf=0x3f3f3f3f;
//priority_queue<int,vector<int>,greater<int> >q;
int ans[28]={0};
int Joseph[14]={0};
int main()
{
int k;
while(scanf("%d",&k)&&k!=0)
{
if(Joseph[k]!=0)
{
printf("%d\n",Joseph[k]);
continue;
}
int n=2*k;
int m=k+1;
for(int i=1;i<=k;i++)
{
ans[i]=(ans[i-1]+m-1)%(n-i+1);
if(ans[i]<k)
{
m++;
i=0;
}
}
Joseph[k]=m;
printf("%d\n",Joseph[k]);
}
return 0;
}