HihoCoder--1296--约瑟夫问题
代码一:超时
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL n,k;
LL solve(){
LL ret=0;
for(int i=2;i<=n;i++)
ret=(ret+k)%i;
return ret;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&n,&k);
printf("%lld\n",solve());
}
return 0;
}
代码二:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL n,k;
LL Josephus(LL n,LL k){
if(n==1) return 0;
else if(n<k){
LL ans=0;
for(int i=2;i<=n;i++)
ans=(ans+k)%i;
return ans;
}
LL ans=Josephus(n-n/k,k);
if(ans<n%k) ans=ans-n%k+n;
else ans=ans-n%k+(ans-n%k)/(k-1);
return ans;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&n,&k);
printf("%lld\n",Josephus(n,k));
}
return 0;
}