摘要:
思路:如果负数的个数为偶数则不必改变,为奇数就将最大负数变为正;对于正数,尽量将1,2变为3即可。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define Maxn 2010 11 #define LL __int64 12 #define MM 1000000007 13 using namespace std; 14 priority_queue les; 15 priority_queue ,gre... 阅读全文
摘要:
题意:有n个人爬山,山顶坐标为0,其他人按升序给出,不同的坐标只能容纳一个人(山顶不限),Alice和Bob轮流选择一个人让他移动任意步,但不能越过前面的人,且不能和前面一个人在相同的位置。现在有一个人是king,给出king是哪个人(id),谁能将国王移动到山顶谁胜。解题思路:先考虑简化版,没有king,谁先不能移动谁输掉。和阶梯博弈类似http://blog.csdn.net/longshuai0821/article/details/7793043。根据人数的奇偶性:把人从上顶向下的位置记为a1,a2,...an, 如果为偶数个人,则把a(2i-1)和a(2i)之间的距离-1(空格数)当 阅读全文
摘要:
打表找规律:当n为质数是,GCD(n)=n;当n为质数k的q次方时,GCD(n)=k;其他情况,GCD(n)=1.代码如下: 1 #include 2 #include 3 #include 4 #define ll long long 5 #define M 1000001 6 using namespace std; 7 ll a[M]; 8 int prime[79000],cnt; 9 bool f[M];10 int fac(int n)11 {12 for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++){13 if(n% 阅读全文
摘要:
K倍动态减法游戏!!!链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4683代码如下: 1 #include 2 #include 3 #include 4 #define ll long long 5 using namespace std; 6 ll a[3000000],b[3000000]; 7 int main() 8 { 9 int i,j,t,k;10 ll n,ans;11 scanf("%d",&t);12 while(t--){13 scanf("%... 阅读全文
摘要:
思路:这就是K倍动态减法游戏,可以参考曹钦翔从“k倍动态减法游戏”出发探究一类组合游戏问题的论文。首先k=1的时候,必败态是2^i,因为我们把数二进制分解后,拿掉最后一个1,那么会导致对方永远也取不完,我们可以拿到最后一个1.k=2的时候,必败态是斐波那契数列,因为任何一个整数n都可以写成两项斐波那契数的和,所以我们拿掉1,对方永远取不完高两位的数。k的时候我们必须构造数列,将n写成数列中一些项的和,使得这些被取到的项的相邻两个倍数差距>k 那么每次去掉最后一个1 还是符合上面的条件。设这个数列已经被构造了i 项,第 i 项为a[ i ],前 i 项可以完美对1..b[ i ] 编码使得 阅读全文
摘要:
思路:求必胜区间和必败区间!1-9 先手胜10-2*9后手胜19-2*9*9先手胜163-2*2*9*9后手胜……易知右区间按9,2交替出现的,所以每次除以18,直到小于18时就可以直接判断了。代码如下: 1 #include 2 int main() 3 { 4 double n; 5 while(scanf("%lf",&n)!=EOF){ 6 while(n>18) n/=18; 7 if(n<=9) puts("Stan wins."); 8 else puts("Ollie wins."); 9 }10 阅读全文
摘要:
思路:主要考虑求1-n中与p互质数的和。直接不好求解,反着来!求1-n中与p不互质的数的和。由于p=p1^e1*p2^e2……所以有容斥原理来解决。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define ll __int64 8 using namespace std; 9 mapmm; 10 map::iterator it; 11 bool f[1000]; 12 int factor[1000],prime[1000],cnt,num,cn; 13 ll an[4... 阅读全文
摘要:
思路:构造矩阵a[i]*b[i]=ax*bx*a[i-1]*b[i-1]+ax*by*a[i-1]+ay*bx*b[i-1]+ay*by代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define ll __int64 8 #define mod 1000000007 9 #define phi 100000000610 using namespace std;11 struct ma12 {13 ll a[5][5];14 };15 ma mul(ma a,ma b)16 {17 ... 阅读全文
摘要:
思路:容易发现二进制表示的数的最低位规律是01010101……;接着是001100110011……;接着是:0000111100001111……这样我们发现每一位的循环节是2^(i+1),前2^i是0,后面的是1.这样就可以算出每一位1出现的次数。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #define ll __int64 6 using namespace std; 7 ll a[35]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384, 8 32768,65536, 阅读全文
摘要:
思路:设期望值为s,前m个是再来一次机会,则有s=(a[1]+s)/n+(a[2]+s)/n+……+(a[m]+s)/n+a[m+1]/n……化简:(n-m)s=sum当sum=0时,为0;当n==m时,为inf;否则为sum/(n-m).代码如下: 1 #include 2 #define I(x) scanf("%d",&x) 3 int main() 4 { 5 int n,m,t,sum; 6 while(I(n)!=EOF){ 7 sum=0; 8 for(int i=0;i<n;i++){ 9 I(t);10 ... 阅读全文