标签:namespace typedef lis algo bit black font const 个人
2个数N和K,表示N个人,数到K出列。(2 <= N <= 10^18, 2 <= K <= 1000)
最后剩下的人的编号
3 2
3
这题是真的卡时间啊,就差0.01秒,十多组数据都是差那么长时间.
想了好久,凭我现在能力也优化不了我的代码,借用一下大佬的代码AC.
留在这以后看.
1 #include<bits/stdc++.h> //正常思路
2 using namespace std;
3 typedef long long ll;
4 #define rep(i,l,r) for(int i=l;i<=r;++i)
5 const int K=1e6+5;
6 bool b[K];
7 int k;
8 ll dfs(const ll &n){
9 if(n<=k){
10 int ans=0;
11 rep(i,2,n) ans=(ans+k)%i;
12 return ans;
13 }
14 ll ans=dfs(n-n/k);
15 return ( ans+n/k*k+ (ans-n%k)/(k-1) )%n;
16 }
17 int main(){
18 ll n;
19 cin>>n>>k;
20 cout<<dfs(n)+1;
21 }
22
23
24
25 //大佬说用图像做的,具体的能看懂就自己看
26 #include<iostream>
27 #include<cstdio>
28 #include<cstring>
29 #include<algorithm>
30 using namespace std;
31 int main(){
32 unsigned long long i,j,n,k;
33 cin>>n>>k;
34 long long y=k%2;
35 long long x=2,t=0;
36 long long z1,z2;
37 z1=y;
38 z2=x;
39 while(x<=n){
40 z1=y;
41 z2=x;
42 t=(x-y)/(k-1);
43 if(t==0) t++;
44 y=y+t*k-((y+t*k)/(x+t))*(x+t);
45 x+=t;
46 }
47 cout<<(z1+(n-z2)*k)%(n)+1<<endl;
48 }
标签:namespace typedef lis algo bit black font const 个人
原文地址:http://www.cnblogs.com/zllwxm123/p/7390648.html