题意:有n个女孩围成一个圈从第1号女孩开始有一个球,可以往编号大的抛去(像传绣球一样绕着环来传),每次必须抛给左边第k个人,比如1号会抛给1+k号女孩。给出女孩的人数,如果他们都每个人都想要碰到球一次,那么这个k应该是多少(满足 1 ≤ K ≤ N/2 且 k必须尽量大)?   例如:n=7,那么1号开始拿球,抛球的顺序是 1, 4, 7, 3, 6, 2, 5, 1.  当球重新回到1女孩手中时,每个人刚好只玩了一次。注:这个数字相当大(3 ≤ N ≤ 102000)

思路:

方法(1):

暴力本地打表,发现n为奇数时,k=(n-1)/2即可。n为偶数时,规律如下图(左列是n,右列是k):

如果n为偶数,且n/2为偶数时,k=(n/2)-1。如果n为偶数,且n/2为奇数时,k=(n/2)-2。需要用到大数的除法和减法。

方法(2):如果能够经过若干次传球且未开始循环,将球抛到第n个女孩那里去,那么肯定可以全部人玩一次,比如1 2 3 4 5 6 7,应该k=3,第1次传给4号,第2次就到达7号,且还没开始循环。那么7号肯定可以传给3号,因为1号传给4号,7号自然就传给3号,接着球又到了6号那里。接续循环下去,球肯定会重回1号手中,且大家都只玩一次。

那么从n/2开始,逐个递减试,看能不能n模k为1。

 // 求模 N%(N/2) != 0 即是结果!
// 奇数:(n-1)/2
// 偶数: n/2 - 1 #include <iostream>
#include <cstdio>
#include <string> using namespace std; // 减一操作 strNum 正序存储 如 100000
void subOne(string &strNum)
{
if (strNum[strNum.length()-] > '')
{
strNum[strNum.length()-]--;
return;
} // 可能需要逐位减一
for(int i=strNum.length()-; i>=; --i)
{
if (strNum[i] == '')
{
strNum[i] = '';
}
else
{
strNum[i]--;
break;
}
} if (strNum[] == '')
strNum.erase(, ); // 移除头位的0
} // strNum / 2
void divHalf(string &strNum)
{
int s = ;
string num;
for(int i=; i<strNum.length(); ++i)
{
s = s* + (strNum[i]-'');
num += (s/ + '');
s %= ;
} // 去掉前导0
int i = ;
for(i=; i<num.length(); ++i)
{
if (num[i] != '')
break;
}
strNum = num.substr(i);
} int main(void)
{
//freopen("in.txt", "r", stdin); string strNum;
while(cin>>strNum)
{
// 末位数字判断奇偶性
int k = strNum[strNum.length()-]-'';
if (k%==)
{
// 偶数: n/2 - 1
divHalf(strNum);
subOne(strNum); // 这里需要特殊处理
while()
{
k = strNum[strNum.length()-]-'';
if (k% != )
break; subOne(strNum);
}
}
else
{
// 奇数:(n-1)/2
subOne(strNum);
divHalf(strNum);
}
cout<<strNum<<endl;
} return ;
}

别人的AC代码

 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
int a, b;
int has[N];
char s[N];
char ans[N]; void div(char * src,int n,char *dest)
{
int len = strlen(src),i,k,t=,s=;
bool flag = true; //商是否有了第一个有效位,防止商首部一直出现0
for(i=,k=; i<len; i++)
{
t = s*+(src[i]-); //新余数
if(t/n> || t==) //余数为0要修改商
{
dest[k++] = t/n+,s = t%n,flag = false;
}
else //不够除,修改余数
{
s = t;
if(!flag) //商已经有有效位了,补零
dest[k++] = '';
}
}
dest[k]='\0';
} bool comp(string num1,string num2)
{
int leng=num1.length(),i;
for(i=;i<leng;i++){if(num1[i]!='')break;}
num1=num1.substr(i,leng);
if(num1.length()==)num1=""; leng=num2.length();
for(i=;i<leng;i++){if(num2[i]!='')break;}
num2=num2.substr(i,leng);
if(num2.length()==)num2=""; if(num1.length()>num2.length())return true;
else if(num1.length()==num2.length())
{
if(num1>=num2)return true;
else return false;
}
else return false;
}
void _minus(string num1,string num2,string &result)
{ if(comp(num2,num1)){string ss=num1;num1=num2;num2=ss;}
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end()); result=""; int i;
for(i=;i<int(num1.length())&&i<int(num2.length());i++)
{
char c=num1[i]-num2[i]+;
result=result+c;
}
if(i<int(num1.length()))
for(;i<int(num1.length());i++)
result=result+num1[i]; int jiewei=;
for(i=;i<int(result.length());i++)
{
int zhi=result[i]-+jiewei;
if(zhi<) {zhi=zhi+;jiewei=-;}
else jiewei=;
result[i]=(char)(zhi+);
} for(i=result.length()-;i>=;i--)
if(result[i]!='')
break; result=result.substr(,i+);
reverse(result.begin(),result.end());
if(result.length()==)result="";
}
//****上面不用看了,大数模版 int main()
{
//freopen("input.txt", "r", stdin); while(gets(s))
{
int len=strlen(s);
if(((s[len-]-'')&)==) //奇数
{
div(s,,ans);
puts(ans);
}
else
{
div(s,,ans); //先减半
len=strlen(ans);
if(((ans[len-]-'')&)== ) //减半后为偶数
{
string tmp(ans);
string res="";
_minus(tmp,"",res);//减1
cout<<res<<endl;
}
else//减半后为奇数
{
string tmp(ans);
string res="";
_minus(tmp,"",res);//减2
cout<<res<<endl;
}
}
}
return ;
}

AC代码

acdream 1210 Chinese Girls' Amusement (打表找规律)的更多相关文章

  1. ACdream 1210 Chinese Girls' Amusement(高精度)

     Chinese Girls' Amusement Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & ...

  2. ACDream:1210:Chinese Girls' Amusement【水题】

    Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Oth ...

  3. Acdream Chinese Girls' Amusement

    A - Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Jav ...

  4. 数学+高精度 ZOJ 2313 Chinese Girls' Amusement

    题目传送门 /* 杭电一题(ACM_steps 2.2.4)的升级版,使用到高精度: 这次不是简单的猜出来的了,求的是GCD (n, k) == 1 最大的k(1, n/2): 1. 若n是奇数,则k ...

  5. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  6. HDU 5753 Permutation Bo (推导 or 打表找规律)

    Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...

  7. HDU 4861 Couple doubi (数论 or 打表找规律)

    Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...

  8. HDU2149-Good Luck in CET-4 Everybody!(博弈,打表找规律)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  9. 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用

    转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html    ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...

随机推荐

  1. failed creating the Direct3d device--debug

    D3DDEVTYPE_REF 使用REF设备,用软件模拟Direct3D API 照理说是为了让电脑能跑本机不能硬件执行的渲染命令的 但我 pDeviceSettings->d3d9.Devic ...

  2. [设计模式] 21 策略模式 Strategy

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...

  3. [转载]Spring Autowire自动装配介绍

    转自: http://www.cnblogs.com/zhishan/p/3190757.html 在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象.但是对于一个大型 ...

  4. MSVC CRT运行库启动代码分析

    原文链接:http://www.programlife.net/msvc-crt-startup.html 在程序进入main/WinMain函数之前,需要先进行C运行库的初始化操作,通过在Visua ...

  5. POJ 1094 Sorting It All Out (拓扑排序,判断序列是否唯一,图是否有环)

    题意:给出n个字符,m对关系,让你输出三种情况:     1.若到第k行时,能判断出唯一的拓扑序列,则输出:         Sorted sequence determined after k re ...

  6. POJ 1330 Nearest Common Ancestors(求最近的公共祖先)

    题意:给出一棵树,再给出两个节点a.b,求离它们最近的公共祖先.方法一: 先用vector存储某节点的子节点,fa数组存储某节点的父节点,最后找出fa[root]=0的根节点root.      之后 ...

  7. Jmeter 快速入门教程(二)--创建简单web测试

    [版权所有: whoistester.com & jmeter.cf] http://wenku.baidu.com/linkurl=9zc4VHe6vUUeMdDZPpNsRehkazZFw ...

  8. 安装ubuntu vi编辑无法正常使用的时候 如方向键变成ABCD

    http://blog.sina.com.cn/s/blog_7e3f6e8f0100vkon.html 在使用ubuntu的时候,发现vi编辑模式下退格键backspace和上下左右光标移动键不能用 ...

  9. cojs 火龙果 解题报告

    昨天晚上做了一发HNOI,感觉有很多新的idea 于是就选了一个出成题目辣 我们考虑暴力 暴力很明显是把这个图A<=D,B<=E的形态搞出来 之后处理相关的询问 这样我们会很容易得到正解: ...

  10. SpringMVC学习总结(三)——Controller接口详解(1)

    4.12.ParameterizableViewController 参数化视图控制器,不进行功能处理(即静态视图),根据参数的逻辑视图名直接选择需要展示的视图. <bean name=&quo ...