1 条题解
-
13
哈哈啊,这个题看起来非常像输出
n/m*m就能得九十分的但是这道题经过稍微的修改后,是不能拿到分的。
我们可以达表:
int nxt[105],vis[105]; void biao(int m) { for(int n=2; n<=100; ++n) { if((n-1)%(m-1))continue; for(int i=1; i<=n; ++i)vis[i]=0,nxt[i]=i+1; nxt[n]=1; int nw=1; for(int i=1; i<=(n-1)/(m-1); ++i) { int nn=nw; for(int j=1; j<m; ++j) { vis[nxt[nw]]=1; nw=nxt[nw]; } nw=nxt[nw]; nxt[nn]=nw; } for(int i=1; i<=n; ++i) { if(vis[i]==0)cerr<<n<<": "<<i<<"\n"; } } }你让m=3,然后达表, 表打出来之后发现:
3: 1
5: 4
7: 7
9: 1//变成1了
11: 4
13: 7
15: 10
17: 13
19: 16
21: 19
23: 22
25: 25
27: 1//变成1了
29: 4
31: 7
33: 10
35: 13
37: 16//每次加3
39: 19
41: 22//每次加3
. . //每次加3 . . .
81: 1//又变成1了
83: 4
85: 7
所以,你找到小于等于n的最大的m的整数次幂,然后减一减,除一除,乘一乘就行了。
for(int i=0;; ++i) { int t=Pow(m,i); if(t>n)break; ++tot,a[i]=t; } for(int i=tot; i>=0; --i) { if(n>=a[i]) { cout<<(n-a[i])/(m-1)*m+1<<"\n"; break; } }Pow是快速幂
- 1
信息
- ID
- 57
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 47
- 已通过
- 10
- 上传者