清北10.6

1.

(flower.cpp/c/pas)

【问题描述】

商店里出售n种不同品种的花。为了装饰桌面,你打算买m支花回家。你觉得放两支一样的花很难看,因此每种品种的花最多买1支。求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值。

【输入格式】

一行3个整数n,m,p,意义如题所述。

【输出格式】

一个整数,表示买花的方案数。

【输入输出样例1】


flower.in


flower.out


4 2 5


1

见选手目录下的flower / flower1.in与flower / flower1.out

【输入输出样例1说明】

用数字1,2,3,4来表示花的种类的话,4种花里买各不b相同的2支的方案有(1,2)、(1,3)、(1,4)、(2,3)、(2,4)、(3,4),共6种方案,模5后余数是1。

【输入输出样例2】

见选手目录下的flower / flower2.in与flower / flower2.out

【数据范围】

对于30%的数据,n,m≤10

对于50%的数据,n,m≤1000

对于80%的数据,1≤m≤n≤50,000

对于100%的数据,1≤m≤n≤1,000,000,p≤1,000,000,000

#include <cstdio>
#include <cmath>
#define N 1000100
int num[N],n,m,i,j,d[N];
long long p,ans;
bool f[N];
int main()
{
    scanf("%d%d%lld",&n,&m,&p);
    for (i=m+1;i<=n;i++) num[i]=1;
    for (i=1;i<=n-m;i++) num[i]-=1;
    for (i=2;i<=n;i++)
      if (!f[i])
        {
           for (j=i+i;j<=n;j+=i)
             {
               f[j]=1;
               d[j]=i;
             }
        }
    for (i=n;i>=2;i--)
    if (d[i]>0)
      {
        num[d[i]]+=num[i];
        num[i/d[i]]+=num[i];
        num[i]=0;
      }
    ans=1;
    for (i=2;i<=n;i++)
    for (j=1;j<=num[i];j++) ans=ans*i%p;
    printf("%lld\n",ans);
    return 0;
}

2.圆桌游戏

(game.cpp/c/pas)

【问题描述】

有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号。对1<i<n的i来说,i号的左边是i+1号,右边是i-1号。1号的右边是n号,n号的左边是1号。每一轮游戏时,主持人指定一个还坐在桌边的人(假设是i号),让他向坐在他左边的人(假设是j号)发起挑战,如果挑战成功,那么j离开圆桌,如果挑战失败,那么i离开圆桌。当圆桌边只剩下一个人时,这个人就是最终的胜利者。

事实上,胜利者的归属是与主持人的选择息息相关的。现在,你来担任圆桌游戏的主持人,并且你已经事先知道了对于任意两个人i号和j号,如果i向j发起挑战,结果是成功还是失败。现在你想知道,如果你可以随意指定每轮发起挑战的人,哪些人可以成为最终的胜利者?

【输入】

第一行包含一个整数n,表示参加游戏的人数;

接下来n行,每行包含n个数,每个数都是0或1中的一个,若第i行第j个数是1,表示i向j发起挑战的结果是成功,否则表示挑战结果是失败。第i行第i列的值一定为0。

【输出】

一行,包含若干个数,表示可能成为最终胜利者的玩家的标号。标号按从小到大的顺序输出,相邻两个数间用1个空格隔开。

【输入输出样例1】


game.in


game.out


3

0 1 0

0 0 1

0 1 0


1 3

见选手目录下的game / game1.in与game / game1.out

【输入输出样例1说明】

先指定2号向3号发起挑战,3号离开;再指定1号向2号发起挑战,2号离开。此时1号是最终胜利者。

先指定1号向2号发起挑战,2号离开;再指定1号向3号发起挑战,1号离开。此时3号是最终胜利者。

无论如何安排挑战顺序,2号都无法成为最终胜利者。

【输入输出样例2】

见选手目录下的game / game2.in与game / game2.out

【数据规模与约定】

对于30%的数据,n≤7

对于100%的数据,n≤100

#include <cstdio>
#include<iostream>
#define N 205
using namespace std;
int n,i,j,k,a[N][N],q[N];
bool f[N][N],ff;
int main()
{
    scanf("%d",&n);
    for (i=1;i<=n;i++)
      for (j=1;j<=n;j++)
        scanf("%d",&a[i][j]);
    for (i=1;i<=n;i++)
      q[i]=q[i+n]=i;
    for (i=1;i<n+n;i++)
      f[i][i+1]=1;
    for (i=n+n-2;i>=1;i--)
      for (j=i+2;j<=n+n;j++)
        for (k=i+1;k<j;k++)
    if (f[i][k]&&f[k][j]&&(a[q[i]][q[k]]||!a[q[k]][q[j]]))
      {
        f[i][j]=1;
        break;
      }
    for (i=1;i<=n;i++)
    if (f[i][i+n])
      {
        if (ff) printf(" ");
        printf("%d",i);
        ff=1;
       }
    printf("\n");
    return 0;
}

3.兔子

(rabbit.cpp/c/pas)

【问题描述】

在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝。更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连。换句话讲,这些兔子窝之前的路径构成一张N个点、M条边的无向连通图,而度数大于2的点至多有1个。

兔子们决定把其中K个兔子窝扩建成临时避难所。当危险来临时,每只兔子均会同时前往距离它最近的避难所躲避,路程中花费的时间在数值上等于经过的路径条数。为了在最短的时间内让所有兔子脱离危险,请你安排一种建造避难所的方式,使最后一只到达避难所的兔子所花费的时间尽量少。

【输入】

第一行有3个整数N,M,K,分别表示兔子窝的个数、路径数、计划建造的避难所数。

接下来M行每行三个整数x,y,表示第x个兔子窝和第y个兔子窝之间有一条路径相连。任意两个兔子窝之间至多只有1条路径。

【输出】

一个整数,表示最后一只到达避难所的兔子花费的最短时间。

【输入输出样例1】


rabbit.in


rabbit.out


5 5 2

1 2

2 3

1 4

1 5

4 5


1

见选手目录下的rabbit / rabbit1.in与rabbit / rabbit1.out

【输入输出样例1说明】

在第2个和第5个兔子窝建造避难所,这样其它兔子窝的兔子最多只需要经过1条路径就可以到达某个避难所。

【输入输出样例2】

见选手目录下的rabbit / rabbit2.in与rabbit / rabbit2.out

【数据规模与约定】

对于30%的数据,N≤15,K≤4;

对于60%的数据,N≤100;

对于100%的数据,1≤K≤N≤1,000,1≤M≤1,500

时间: 2024-12-04 19:10:02

清北10.6的相关文章

清北夏令营考试day1

清北夏令营考试day1 送分题(songfen) Time Limit:1000ms   Memory Limit:128MB 题目描述: LYK喜欢干一些有挑战的事,比如说求区间最大子段和.它知道这个题目有O(n)的做法.于是它想加强一下. 也就是说,LYK一开始有n个数,第i个数字是ai,它找来了一个新的数字P,并想将这n个数字中恰好一个数字替换成P.要求替换后的最大子段和尽可能大. LYK知道这个题目仍然很简单,于是就扔给大家来送分啦~ 注:最大子段和是指在n个数中选择一段区间[L,R](

五一清北总结——day1+day2

五一清北学习总结 ——day1+day2 一.排序 1.快速排序 O(nlogn)的排序,用sort可以快速完成,但是可以被卡,手写sort利用随机数可以避免被卡掉. 代码: void quick_sort(int *a, int l, int r) { swap(a[l], a[rand()*rand() % (r -l + 1) +l]); int tmp = a[l]; int l_ = l, r_ = r; while (l < r) { while (l < r) { if (a[r

清北押题班(1)

清北押题冲刺班Text1 T1 Count 问有几个无序二元组 $ (x ?, ?y) $ 满足 $ xy \equiv 1?(mod?P ) $ , $ 0 \leq x < P?, ?0 \leq y <P $ 解题思路: 你没看错,这是day1的T1,一道赤裸裸的数学题. Subtask 1:枚举 $ O(P^2) $ 个二元组,选出符合条件的,再去重: Subtask 2:可以发现模 $ P $ 意义下,一个数 x 有逆元,当且仅当 $ gcd(x, P) = 1 $ .并且如果 $

# 清北冬令营真题泛做

清北冬令营真题泛做 前言 这段时间为了准备冬令营把清北冬令营真题都做了一下.更个博回顾一下(免得你们老说我咕咕咕). 先写良心PKU的题再写THU的题, 主要是THU的题和PKU比起来真的毒瘤好多...... PKUWC2018 [PKUWC2018]Minimax 一个比较显然的暴力是归并排序,每次直接前后缀计算答案即可. 为啥不用线段树合并代替归并排序呢? 暴力线段树合并,合并的过程中顺便算一下即可,由于权值区间不交所以复杂度一个\(log\). [PKUWC2018]Slay the Sp

铁轨 清北学堂 线段树

铁轨 清北学堂 线段树 [题目描述] R 国的铁轨经常会进行重新修建. R 国是一个细长的国家,一共有 n 个城市排成一排,首都位于 1 号城市,相邻两个城市之间有铁路相连. 每次新建铁轨的时候,一定是从首都开始修建,直到某一个城市为止,这其间的铁路都会变成新版本的设 施,而旧设施会被拆除.然而,由于 R 国的工程师脑子不太好使,任意两种不同版本的铁路之间都无法连 接,因此必须要进行换乘. 现在给出你修建铁轨的操作,小 R 时不时第会想问你,如果在第 x 个城市到第 y 个城市之间随机选择一个

清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的是这里纸张太小,小A无法把故事详细地说给大家听.可能小A自己也讲不清楚自己的故事,因为如果讲清了,也就没有这道题目了-- 小A的问题是这个样子,它找到了n份不同的工作,第i份工作每个月有ai的工资,每份工作需要小A每天

今我校——山东省著名高中——济南市历城区第二中学《清北学子经验交流会》感悟

放飞梦想,一起成长--历城二中清北学子经验交流会于今日9时在行政楼会议室隆重召开. 与会领导有:济南市教育局宣传科科长.高中部李矿水副校长.高三级部级部主任暨高中部副校长田庆民校长.全国生物奥赛金牌暨清华大学预录取的任雨同学.化学奥赛全国金牌被清华大学降至一本线录取的两位学长.数学奥赛被清华大学降至一本线录取的一位学长以及来自五湖四海的媒体朋友们,会议开场对他们的到来表达了热烈的欢迎.

2016.10.29 清北学堂NOIP冲刺班Day1 AM 考试总结

成绩:满分300,我得了200, 1:90//前两个题目都是模拟,没用到什么其他算法,第一题有可能少考虑了一点细节 2:100 3:10//感觉是个DP,但是毫无思路,只打了个普通背包,10分而已. 题目+数据:http://pan.baidu.com/s/1bpj3SR1 下面是我的代码: 这个题目中我为了得到部分分,而特别判断了几组数据. T1: 1 /* 2 以后一定要仔细读数据范围,一定要. 3 数据范围中:20%的数据,只有秒数可能不同,言外之意就是可能相同. 4 而我的程序因为没有考

清北学堂2017NOIP冬令营入学测试

P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的是这里纸张太小,小A无法把故事详细地说给大家听.可能小A自己也讲不清楚自己的故事,因为如果讲清了,也就没有这道题目了-- 小A的问题是这个样子,它找到了n份不同的工作,第i份工作每个月有ai的工资,每份工作需要小A每天工作8小时,一周工作7天.小A想知道性价