NOIP模拟赛 篮球比赛1

篮球比赛1(basketball1.*)

    Czhou为了提高机房里各种神牛的身体素质,决定在每次训练后举行篮球比赛。为了保持比赛公平,Czhou要将神牛们分成两队。首先神牛们赛前都要排成固定的队伍;然后Czhou将队伍分成一半(前一半和后一半队伍人数可以不等),再分别从两个队伍中选出一些人进行篮球比赛。为了保持公平性,Czhou要求第一个队伍参加比赛的神牛能力的XOR值等于第二个队伍参加比赛的神牛能力的and值。为了增加比赛趣味,每次比赛的参加神牛们不能一样,Czhou现在想知道可以举办多少天的比赛。(很明显参加比赛的人数不能为0)

Xor即为亦或, 0 xor 0 = 0, 0 xor 1 = 1, 1 xor 0 = 1 , 1 xor 1 = 0

And即为与, 0 and 0 = 0, 0 and 1 = 0, 1 and 0 = 0, 1 and 1 = 1

举个例子10 and 2 = 1010 xor 2 = 8, 10 = (1010)2  2 = (10)2  8 =(1000)2

 

Input:basketball1.in

 

    第一行n,表示机房有n个神牛。

    第二行有n个数a_i,表示各个神牛的能力值,并且这是赛前各个神牛的排队方式。

Output: basketball1.out

    就一个数字,表示可以举办多少天比赛。由于天数会比较多,输出结果模1000000007。

Sample1.input:

3

1 2 3

Sample1.output

1

Sample2.input

4

1 2 3 3 

Sample2.output

4

样例1说明:1 xor 2 = 3

样例2说明:可以举办四天比赛,参加比赛的双方队伍分别是(1,2)(3);(1,2)(3);(1,2)(3,3);(3)(3)这里虽然能力值相同,但是指的是不同的牛。 

对于(1,2)(3,3)来说,队伍分为两个队伍:(1,2)(3,3),再从各自队伍选出全部选手参加比赛

对于(3)(3)来说,队列分为两个队伍:(1,2,3(3),再从各自队伍中选出3进行比赛

 

数据范围:

0<=n<=10^3

0 <= a_i <1024

 

一题DP,一开始卡在去重。。。应该还要写个快速读入的

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 const int mod=1000000007;
 6 
 7 int n;
 8 long long A[1001],XOR[1001][1024],AND[1001][1024],sum[1024];
 9 long long ans=0;
10 
11 int main()
12 {
13     cin>>n;
14     for(int i=1;i<=n;i++) cin>>A[i];
15     memset(sum,0,sizeof(sum));
16     for(int i=1;i<n;i++)
17     {
18         for(int j=0;j<1024;j++)
19         {
20             XOR[i][j^A[i]]+=sum[j];
21             XOR[i][j^A[i]]%=mod;
22         }
23         XOR[i][A[i]]++;
24         XOR[i][A[i]]%=mod;
25         for(int j=0;j<1024;j++)
26         {
27             sum[j]+=XOR[i][j];
28             sum[j]%=mod;
29         }
30     }
31     memset(sum,0,sizeof(sum));
32     for(int i=n;i>1;i--)
33     {
34         for(int j=0;j<1024;j++)
35         {
36             AND[i][j&A[i]]+=sum[j];
37             AND[i][j&A[i]]%=mod;
38         }
39         AND[i][A[i]]++;
40         AND[i][A[i]]%=mod;
41         for(int j=0;j<1024;j++)
42         {
43             sum[j]+=AND[i][j];
44             sum[j]%=mod;
45         }
46     }
47     memset(sum,0,sizeof(sum));
48     for(int i=1;i<n;i++)
49     {
50         for(int j=0;j<1024;j++)
51         {
52             sum[j]+=XOR[i][j];
53             sum[j]%=mod;
54         }
55         for(int j=0;j<1024;j++)
56             ans=(ans+sum[j]*AND[i+1][j])%mod;
57     }
58     cout<<ans<<endl;
59 }

 

转载于:https://www.cnblogs.com/InWILL/p/5966109.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NOI(全国青少年信息学奥林匹克竞模拟的测试数据是指用于评测参选手的程序的输入和对应的输出。测试数据是非常重要的,因为它决定了参选手的程序能否正确地解决问题。 在NOI模拟中,测试数据具有以下特点: 1.充分覆盖:测试数据应涵盖各种可能的输入情况,包括边界条件和极端情况。通过提供不同的测试数据,可以考察选手对问题的全面理解和解决能力。 2.随机性和均衡性:为了公平起见,测试数据应该是随机生成的,而不是针对某个特定算法或解法设计的。同时,测试数据应该是均衡的,即各种情况的概率应该大致相等,以避免偏向某些解法。 3.合理性和可行性:测试数据应该是合理和可行的,即符合题目要求的输入数据,并且是选手能够通过编写程序来处理的。测试数据应该考虑到程序的限制和时间复杂度,以充分测试选手的编程能力。 NOI模拟的测试数据通常由经验丰富的考题组负责生成。他们会根据题目的要求和限制,设计出一组合理、充分、随机和均衡的测试数据,以确保参选手的程序在各种情况下都能正确运行,并且能通过性能测试。 总之,测试数据在NOI模拟中起到了至关重要的作用,它既考察了选手对问题的理解和解决能力,又提高了选手编程的技巧和效率。同时,合理和恰当的测试数据也是公平竞的保证,确保每个参选手有相同的机会和条件进行竞争。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值