玲珑杯 #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 0x3f3f3f3f
typedef 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:虽然这题目有点熟悉,但不会做。。

posted @ 2017-02-12 14:47  v9fly  阅读(214)  评论(0编辑  收藏  举报