51nod 1074 约瑟夫环V2

来源:互联网 发布:mmd各种动作数据百度云 编辑:程序博客网 时间:2024/06/05 01:53

1074 约瑟夫环 V2
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
 收藏
 关注
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
Input
2个数N和K,表示N个人,数到K出列。(2 <= N <= 10^18, 2 <= K <= 1000)
Output
最后剩下的人的编号
Input示例
3 2
Output示例
3

 用函数图像做的


然后必须让kx+b<x+1
所以每次kx+b<=x+1 的时候
更新b  

- -然后b超界了 

就让kx+b=新的b  然后变成kx1+b=b  b+nk>=x+n 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;//long long f[3000];int main(){    unsigned long long i,j,n,k;    cin>>n>>k;    //f[1]=0;i=2;    f[1]=0;   // for(i=2;i<=n;i++) f[i]=(f[i-1]+k)%i;    long long y=k%2;    long long x=2,t=0;    long long z1,z2;    z1=y;    z2=x;    while(x<=n)    {        z1=y;        z2=x;        t=(x-y)/(k-1);        if(t==0) t++;        y=y+t*k-((y+t*k)/(x+t))*(x+t);        x+=t;        //cout<<y<<' '<<f[x]<<' '<<x<<' '<<z1<<' '<<z2<<endl;    }    cout<<(z1+(n-z2)*k)%(n)+1<<endl;}



0 0
原创粉丝点击