typedeflonglong ll;
ll calc(int n, ll m){
ll p =0;for(int i =2; i <= n; i++){
p =(p + m)% i;}return p +1;//}
二、n個人,1至m報數,問第k個出局的人的編號 (k<106)
公式
f(n,k)=(f(n−1,k−1)+m−1)%n+1
f(n−k+1,1)=m%(n−k+1)if(f==0)f=n−k+1
複雜度 O(k)
代碼
typedeflonglong ll;
ll calc(int n, ll m){
ll p =0;for(int i =2; i <= n; i++){
p =(p + m)% i;}return p +1;//}
三、n個人,1至m報數,問第k個出局的人的編號(m<106)
公式:同上,這裏的核心是一下子跳多次,不是一個一個轉移
複雜度: O(m∗log(m))
代碼
ll cal2(ll n, ll m, ll k){if(m ==1)return k;else{
ll a = n - k +1, b =1;
ll c = m % a, x =0;if(c ==0) c = a;while(b + x <= k){
a += x, b += x, c += m * x;
c %= a;if(c ==0) c = a;
x =(a - c)/(m -1)+1;}
c +=(k - b)* m;
c %= n;if(c ==0) c = n;return c;}}