首页 > 代码库 > 玲珑杯 #9 A 质数 B 博弈 C 不会

玲珑杯 #9 A 质数 B 博弈 C 不会

玲珑杯 #9

tangjz老师出的题,一伙大佬来抢钱,本菜鸡连签到题都做不了,只能补补题了==

官方题解

A.Check-in Problem

题意:判断n是否恰好有p个因子,p为质数,1<=n<=1e18,p>2。

tags: 1、因为p>2知n肯定是一个大于1的非素数,由算术基本定理N=(P1^a1)*(P2^a2)*(P3^a3)......(Pn^an), n的因子个数就是(a1+1)×(a2+1)×(a3+1)×...×(an+1)。又因为p是质数,所以n的质因子只能有一个p1,且n=p1^(p-1)。       2、所以只要判断n开p-1次方是质数即可。对于p>3的情况,直接预处理出1e6内的质数就行;对于p==3的情况,用 Miller-Rabin 算法判定(需要 O(1) 的模乘法)。      但不知道哪里错了,挖了十几发都过不了,留坑待补

B.Alice and Bob

题意:k层的完美二叉树,两人博弈,轮流任取一个点,必须从这个点选取出数,如果有儿子就转给儿子,如果是叶子结点就移除。最后不能操作的人败,问先手第一次操作有几种方案可保证胜。

tags:题解说用SG函数,还不太会SG,后面补一下吧。。但这个题类似于阶梯博弈,也可以做,只要看奇数层就行。

技术分享
#include<bits/stdc++.h>using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define FF(i,a,b) for (int i=a;i<=b;i++)#define F(i,b,a)  for (int i=b;i>=a;i--)#define mes(a,b)  memset(a,b,sizeof(a))#define INF 0x3f3f3f3ftypedef long long ll;const int N = 2e6+10;int b[N], a[N], t, T, k, tt;ll s, m, sum;int main(){    scanf("%d", &T);    while(T--) {        t=tt=1, s=sum=0; mes(b, 0);        scanf("%d", &k);        FF(i,1,k) for(int j=1; j<=(1<<(i-1)); j++) {            scanf("%d", &a[t]);            if((k-i+1)&1)  s^=a[t], b[tt++]=t ;            t++;        }        if(s==0) printf("0\n");        else {            FF(i,1,tt-1)  {                m=s^a[b[i]];                if(m<a[b[i]]) {                    if(b[i]>=(1<<(k-1))) sum++;                    else sum+=2;                }                else if(a[(b[i]>>1)]>=(m-a[b[i]])) sum++;            }            printf("%lld\n", sum);        }    }    return 0;}
View Code

 C. Red Packets

题意:n种商品,价格ai,开心值bi。有金钱k元,选取连续的多件商品,可以免费m件。问在花费k元钱内,可以获得最大开心值是多少。

tags:虽然这题目有点熟悉,但不会做。。

玲珑杯 #9 A 质数 B 博弈 C 不会