传送门

这道题被严重恶意评分了,实际应该是绿题。

因为其实我们只需要模拟即可。这里我们引入一种新的东西:约瑟夫环。

它能直接告诉你约瑟夫问题中最后一个存活下来的人是谁。(不过下标是从0开始的,实际使用的时候需要+1)

如果有n个人,每次报到m的时候出列,那么令f[i]表示有i个人的时候最后存活的人的下标,那么有f[i+1] = (f[i] + m) % i,其中f[0] = 0;

怎么推的呢?对于一个序列,在长度相同的时候,获胜的人应该是固定的,我们假设现在报到m的人出列了,下一个人(m+1)成为了队首,其实相当于所有人往前移动了m位.那么倒着退回去,我们也就能知道其实获胜的人相对应向后移了m位,不过因为人数在增加,所以我们要每次%i。

对于这道题,因为1已经出去了,所以我们要求的就是n-1的约瑟夫环的最小m,使得f[n-1] = 11,这样我们模拟即可。

看一下代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const int INF = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} int n; int main()
{
while()
{
n = read();
if(!n) break;
rep(i,,n-)
{
int k = ;
rep(j,,n-) k = (k + i) % j;
if(k == )
{
printf("%d\n",i);
break;
}
}
}
return ;
}

最新文章

  1. 数论 - Moon Game
  2. c# 调用c++DLL方法及注意事项
  3. css3:flexbox
  4. Jmeter之逻辑控制器(Logic Controller)
  5. 单链表List的C实现
  6. HTML 5 参考手册
  7. Ext.QuickTips.init();
  8. Jquery调用从ashx文件返回的jsonp格式的数据处理实例
  9. Android Studio中JNI -- 1 -- 配置方法
  10. codeforces #260 DIV 2 C题Boredom(DP)
  11. struts2相关简单介绍
  12. image management in kubernet
  13. python 项目启动路径自动添加
  14. 另一种的SQL注入和DNS结合的技巧
  15. Oracle 10G 安装文档
  16. Codeforces 215D. Hot Days(贪心)
  17. SpringCloud学习1-服务注册与发现(Eureka)
  18. 在mac上使用tar.gz安装mysql
  19. 基于ejabberd简单实现xmpp群聊离线消息
  20. Python笔记 #02# Inner workings of lists

热门文章

  1. js动态适配移动端font-size,单位:rem
  2. eslint 在webstorm配置
  3. java学习笔记总略
  4. 【hibernate/JPA】注解方式实现 复合主键【spring boot】
  5. linux驱动开发流程
  6. 《C++ Primer Plus》学习笔记9
  7. stl之multiset容器的应用
  8. hdu5289(2015多校1)--Assignment(单调队列)
  9. Elasticsearch 之 慘痛部署(分片移位)
  10. 20160222.CCPP体系具体解释(0032天)