台州学院第十二届校赛记录(B,C,E,H,I,J,L)
传送门:点我
题目很棒,感谢出题验题的大佬们。
细节坑不少,是好事。
还是很菜,继续加油!
B:
桃子的生日
总提交: 344 测试通过: 43
描述
桃子这几天在收集纪念币,总共最多只有N种不同的纪念币,他已经收集了K种不同的纪念币。这不,桃子的生日快到了,他的M个小伙伴们决定送他纪念币,如何送给桃子呢?他们都同意了如下三个规则:
1. 每个人送的纪念币与其他人的都一样多;
2. 送给桃子的任意两枚纪念币种类均不同;
3. 桃子从小伙伴那得到至少L枚新的。
但他的小伙伴们不知道桃子收集了哪些纪念币。他们想尽量少花钱,所以他们想购买满足规则的最少数量的纪念币。
输入
第一行一个整数T(≤100),代表有T组数据。
对于每组数据,包含一行为四个整数N, M, K, L(1≤K≤N≤1018,1≤M,L≤1018),代表有N种不同的纪念币,M个小伙伴,桃子本来有K种不同的纪念币,最后桃子手上至少有L枚新的纪念币。
输出
输出桃子的一个小伙伴赠送的最少数量的纪念币。如果不可能同时满足三个条件输出-1。
样例输入
2
20 15 2 3
10 11 2 4
样例输出
1
-1
提示
第一组数据:桃子的小伙伴每人送一枚纪念币,因为桃子原来有2种纪念币,小伙伴总共送15枚,一定有至少13枚是新的,满足题目要求且最少。
第二组数据:总共有10种不同的纪念币,而桃子的小伙伴有11个,不能满足条件2。
思路:
首先,提示告诉我们如果M>N是直接输出-1。
很明显可以看出K+L是要达到的个数,如果K+L > M,也是可以直接输出-1的,因为达不到。
最后直接判断每个人送满足条件的个数,会不会超过N即可。具体看代码有注释
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi 3.141592653589793
const LL mod = 1e9+;
int main()
{
int _;
for(scanf("%d",&_);_--;){
LL n,m,k,l;
scanf("%I64d%I64d%I64d%I64d",&n,&m,&k,&l);
if(m > n){
puts("-1");continue;
}
LL sum = k+l;
if(sum > n){
puts("-1");continue;
}
LL ans = (sum%m == )?sum/m:sum/m+;//每个人要送的个数,保证可以满足K+L
if(ans * m > n){//如果每个人送的总数超过了N,根据蜂巢原理必定会重复。所以不行
puts("-1");continue;
}
else{
printf("%I64d\n",ans);
}
}
}
/*
2
100 6 2 98
*/
C
桃子的难题
总提交: 102 测试通过: 6
描述
taozi喜欢数学,但是遇到数学题就头疼,zdragon为了让大家高兴高兴,给taozi出了道难题:
S=∑qi (1≤i≤n),由于答案可能会很大,答案对p取模。
输入
输入第一行为测试样例组数T(1≤T≤100)。
对于每组数据第一行包含三个正整数n,q,p(1≤n,q,p≤109)。
输出
对于每组数据,输出一个S对p取模的值。
样例输入
2
3 2 100
4 511 520
样例输出
14
184
提示
对于第一个样例,21+22+23=14,对100取模,答案为14。
思路:
S=∑qi (1≤i≤n),这玩意首先是个等比数列求和。然后取模,很容易想到套等比数列求和公式,逆元,取模。然而会出错。。因为可能在模数的意义下可能没有逆元。
实际上是等比数列二分求和处理这玩意(最近写过一样的题目所以知道怎么做)
考虑S=∑qi (0≤i≤n),注意是有0.
就是1+q^1+q^2+....q^n
然后当n是奇数(感谢c_wwww指正)数的时候:
把这个式子分成前后相等长度的两部分
(p^0+p^1+..p^(n/2))+ (p^(n/2+1)+p(n/2+2)+...+p^n)
把后半部分的p^(n/2+1)提取出来。
(p^0+p^1+..p^(n/2)) * (p^(n/2+1)+1)
右边快速幂,左边递归
偶数的话去掉p^n,同样的操作去左边递归右边快速幂。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi 3.141592653589793
long long q(LL a,LL n,LL mod)
{
LL ans = 1LL,temp = a%mod;
while(n){
if(n&){
ans=(ans*temp)%mod;
}
n>>=;
temp=(temp*temp)%mod;
}
return ans;
}
LL sum(LL p,LL n,LL mod)
{
if(p==)return ;
if(n==)return ;
return (n&)?(((+q(p,n/+,mod))%mod*sum(p,n/,mod)%mod)%mod):(((+q(p,n/+,mod))%mod*sum(p,n/-,mod)+q(p,n/,mod)%mod)%mod);
}
int main()
{
/*
LL a,b,p;
while(~scanf("%lld %lld %lld",&a,&b,&p)){
LL sum = 0;for(int i = 1 ; i <= a ; i ++){
sum += q(b,i,p);
sum%=p;
}
cout<<sum<<endl;
}
*/
LL a,b,p;
int _;
for(scanf("%d",&_);_--;){
scanf("%lld %lld %lld",&a,&b,&p);
LL ans = sum(b,a,p);
printf("%lld\n",(ans+p-)%p);
}
}/*
2
3 2 100
4 511 520
*/
E:
YuYu的扑克牌游戏
总提交: 14 测试通过: 3
描述
YuYu最近正在学习多位数的乘法,crq想考考她的学习情况,但又懒得出题,因此直接拿了一副扑克牌。扑克牌去掉了大小王和牌面值较大的牌,只留下A、2、3、4、5、6、7、8 、9,每种花色有9张牌,牌面值分别为1~9,现从中抽出n张牌,crq要求YuYu从n张牌中挑出若干张组成乘法公式a*b=c,其中a、b和c均可以由多张牌拼接而成(如1和2能拼成12,也能拼成21),但a和b最多是2位的正整数(因为YuYu害怕太大的数)。
如给定4 5 6 9四张牌,可以组成:
6*9=54
9*6=54
一个公式中同一张牌最多只能使用一次。
输入
多组数据,第一行为数据组数T(T<=100)。
每组数据第一行为正整数n(n<=36),第二行为n个正整数,表示从一副牌中抽取的牌面值,所有牌面值在1到9之间。
输出
对于每组数据,输出最多有多少种可能的公式。
样例输入
2
4
6 9 5 4
5
1 6 6 6 9
样例输出
2
4
思路:
注意C没限制是两位数即可
一眼感觉是36^4*100的题,实际100*100两个循环判断就行了。
交了打表代码过了。。不是很懂。
实际我操作的是 一个两位数乘以一个两位数等于一个四位数,比如说什么01*02=0004前面补个0
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi 3.141592653589793
string change(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8){
string s = "";
s += (a2+'');
s += (a1+'');
s += '*';
s += (a4+'');
s += (a3+'');
s += '=';
s += (a8+'');
s += (a7+'');
s += (a6+'');
s += (a5+'');
return s;
}
set<string>s;
int main(){
int _;
while(~scanf("%d",&_)){
while(_--){
s.clear();
int n,a[], cnt[];
memset(cnt,,sizeof(cnt));
scanf("%d",&n);
for(int i = ; i < n ; i ++){
scanf("%d",a+i);
cnt[a[i]]++;
}
int sum = ;
for(int i = ; i < ; i++){
for(int j = ; j < ; j++){
int temp = i;
int num1 = temp%;
int num2 = temp/%;
temp = j;
int num3 = temp%;//个位
int num4 = temp/%;//十位 temp = i*j;
int num5 = temp%;//个位
temp/=;
int num6 = temp%;//十位
temp/=;
int num7 = temp%;//百位
temp/=;
int num8 = temp%;//千位 if(num1 == ||num3 == ||num5 == )continue; if(num8 != ){
if(num7 == || num6==)continue;
}else{
if(num7!=){
if(num6==)continue;
}
else{
if(num6!=){
if(num5 == )continue;
}
}
}
//cout<<num8<<num7<<num6<<num5<<endl;
if(num1 != )
cnt[num1]--; if(num2 != )
cnt[num2]--; if(num3 != )
cnt[num3]--; if(num4 != )
cnt[num4]--; if(num5 != )
cnt[num5]--; if(num6 != )
cnt[num6]--; if(num7 != )
cnt[num7]--; if(num8 != )
cnt[num8]--; if( cnt[num1] >= && cnt[num2] >= &&
cnt[num3] >= && cnt[num4] >= &&
cnt[num5] >= && cnt[num6] >= &&
cnt[num7] >= && cnt[num8] >= ){
string ss = change(num1,num2,num3,num4,num5,num6,num7,num8);
s.insert(ss);
}
if(num1 != )
cnt[num1]++;
if(num2 != )
cnt[num2]++;
if(num3 != )
cnt[num3]++;
if(num4 != )
cnt[num4]++;
if(num5 != )
cnt[num5]++;
if(num6 != )
cnt[num6]++;
if(num7 != )
cnt[num7]++;
if(num8 != )
cnt[num8]++;
}
}
// for(set<string>::iterator it = s.begin() ; it != s.end();it++){
// cout<<*it<<endl;
// }
printf("%d\n",s.size());
}}
}
/* */
H:
桃子的LCM
总提交: 364 测试通过: 64
描述
桃子很喜欢数学,最近他对lcm(最小公倍数)非常感兴趣。小翁看到桃子在纸上写了一大堆数学公式,就想考考桃子。他给小桃出了个题:现在你手上有一个数b,对于每个1≤a≤1018,他把lcm(a,b)/a的不同值写在了纸上,他想问你,他能在纸上写几个不同的数字。
输入
第一行一个整数T(≤50),代表有T组数据。
对于每组数据,第一行一个整数b(1≤n≤1010),代表小桃手上的数b。
输出
输出一个数代表不同值的个数。
样例输入
2
1
2
样例输出
1
2
提示
第一个样例,b等于1,只有1个值1。
第二个样例,b等于2,只有2个值1和2。
思路:
打个表(a 从1到b+10 )
就能发现当a > b时候题目那个式子答案都一样。然后出现的不一样的值都是b的约数。所以题目转化成了求b的约数个数。
(首A拿到了,笑)
复杂度是O(sqrt(n))
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi 3.141592653589793
int main()
{
int n;
scanf("%d",&n);
while(n--){
LL a;int sum = ;
scanf("%lld",&a);
LL k = sqrt(a);
for(int i = ; i <= k; i++){
if(a%i==){
sum+=;
}
}
if(k*k==a)sum--;
printf("%d\n",sum);
}
return ;
}/* */
I:
桃子的长号
总提交: 347 测试通过: 47
描述
C++课上,老师讲到了映射map,桃子觉得映射很神奇,可以把一个串变成一个数存储,也可以把一堆很大的数字变成很小的数字。为了加深对映射的印象,桃子出了下面这个题:
桃子将给你一个长的十进制数a,包含n个1-9的数字,你有一个映射函数f可以把x变成f(x)。
你可以执行以下操作不超过1次:选择一个非空的连续子段并把里面的每个数字x映射成f(x)。例如a=1337,f(1)=1,f(3)=5,f(7)=3,你将选择区间[2,3],并把3变成f(3)=5,最终得到1557。
现在你执行了操作不超过1次,你可以得到的最大数是多少。
输入
第一行一个整数T(1≤T≤95),代表有T组数据。
对于每组数据:
第一行为一个整数n(1≤n≤2*105),为十进制数a的长度。
第二行为n个数字组成的整数a:a1a2...an(1≤ai≤9)。
第三行为9个数字f(1),f(2),...,f(9),代表映射函数f。
数据保证∑n<=106。
输出
每组数据输出一行,代表桃子能得到的最大值。
样例输入
3
4
1337
1 2 5 4 6 6 3 1 9
5
11111
9 8 7 6 5 4 3 2 1
2
33
1 1 1 1 1 1 1 1 1
样例输出
1557
99999
33
思路:
记第i个数是num[i];
从前往后遍历第一个f(num[i]) > num[i]的改掉是最优的。然后一个坑的点是,继续遍历下去的时候可以是f(num[pos]) == num[pos]
举个例子
5
32314
1 4 3 7 1 1 1 1 1
这个数的第四个1要修改成为1,可以让第五位的4变成7。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi 3.141592653589793
char s[];
int main()
{ int _;
for(scanf("%d",&_);_--;){
int n;
scanf("%d %s",&n,s);
int f[];
for(int i = ; i <= ;i++){
scanf("%d",f+i);
}
for(int i = ; i < n ; i++){
int a = s[i] - '';
if(f[a] > a){
int pos = i;
while(f[a] >= a && pos < n){
s[pos] = f[a]+'';
pos++;
a = s[pos] - '';
}
break;
}
}
printf("%s\n",s);
}
}/*
3
4
1337
1 2 5 4 6 6 3 1 9
5
11111
9 8 7 6 5 4 3 2 1
5
32314
1 4 3 7 1 1 1 1 1 */
J:
桃子的项链
总提交: 102 测试通过: 17
描述
桃子喜欢收藏,尤其是对项链有着奇怪的要求:每颗珠子的颜色必须不同。由于各种原因,他找不到这种项链,所以他决定自己给项链涂色。
现在他手上有n种不同颜色的涂料,项链(环形)上有n颗珠子,他想知道他有多少种不同的涂法。若一条项链能通过绕中心旋转或翻转而变成另一个项链,则认为是同一种涂法。
输入
输入第一行为测试样例组数T(1<=T<=10000)。
对于每组数据包含一个正整数n(1<=n<=106),代表不同颜色的涂料种数或珠子数目。
输出
对于每组数据,输出一个整数代表有多少种不同的涂法。结果对109+7取模。
样例输入
2
3
4
样例输出
1
3
思路:
打表之后发现是(n!)/2。猜了2发(n+1)*n/2。。。。老老实实打表吧。
n= 1,2时候需要另外判断。(我是存数组然后直接输出)
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi 3.141592653589793
const LL mod = 1e9+;
LL a[];
int main()
{
a[] = a[] = a[] = ;
for(int i = ; i <= ; i++){
a[i] = (a[i-] * i)%mod;
}
int _;
for(scanf("%d",&_);_--;){
int n;
scanf("%d",&n);
cout<<a[n-]<<endl;
}
}
/*
4
3
4
5
6
*/
L:
桃子的幸运彩票
总提交: 172 测试通过: 23
描述
最近桃子爱上了博彩,一天他买了一张彩票,上面印着带有n个数字的序列a1a2a3...an。
如果一张彩票是幸运的,当且仅当其满足如下全部条件:
1. 序列能被恰好分成不相交的至少2段;
2. 每一段区间[l,r]的和都是相同的。
请你帮助桃子判断他手上的彩票是不是幸运的。
例如123426是幸运的,它可以分为3段,123、42和6,1+2+3=4+2=6。
不相交就是序列的每个数字恰好属于一个段。
输入
第一行一个整数T(≤100),代表有T组数据。
对于每组数据,第一行一个整数n(2≤n≤100),代表彩票中数字序列的位数。
第二行为一个长度为n的数字序列a1a2a3...an(0≤ai≤9)。
输出
如果这张彩票是幸运的,输出YES,否则输出NO。
样例输入
2
5
73452
4
1248
样例输出
YES
NO
提示
第一个样例:能分成3段,7、34和52,7=3+4=5+2。
第二个样例:不能分出。
思路:
求个前缀和,暴力枚举每个区间可能的和,因为a_i都是很小的!!之后看看看看能不能划分就行了。
坑点:如果所有的数都是0,也是可以的。被这个坑了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi 3.141592653589793
int main()
{ int _;
for(scanf("%d",&_);_--;){
int n;
scanf("%d",&n);
string s;cin>>s;
int a[],flag = ;
int sum[];
memset(sum,,sizeof(sum));
for(int i = ; i < n ; i++){
a[i] = s[i] - '';
if(i == )sum[i+] = a[i];
else sum[i+] = sum[i]+a[i];
}
if(sum[n] == ){
puts("YES");continue;
}
for(int i = ; i < sum[n]; i ++){
int pos = ;
for(int j = ; j <= n ; j++){
int nowsum = sum[j] - sum[pos];
if(nowsum == i){
pos = j;
// printf("%d %d\n",i,pos);
}
}
if(pos == n || sum[pos] == sum[n]){
flag = ;
break;
}
}
flag ? puts("YES"):puts("NO");
}
}/*
4
20
00101000021000200100
5
73452
4
1248
8
10101000 1~10 */
台州学院第十二届校赛记录(B,C,E,H,I,J,L)的更多相关文章
- HZNU第十二届校赛赛后补题
愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...
- Little Sub and Traveling(杭师大第十二届校赛E题) 欧拉回路
题目传送门 题目大意: 从0出发,每次只能跳到(i*2)%n或者(i*2+1)%n,求字典序最大的哈密顿回路. 思路: 首先n为奇数时无解,先来证明这一点. 先假设n为奇数,若要回到原点,则必定有一步 ...
- Little Sub and Piggybank (杭师大第十二届校赛G题) DP
题目传送门 题意:每天能往存钱罐加任意实数的钱,每天不能多于起那一天放的钱数.如果某一天的钱数恰好等于那天的特价商品,则可以买,求最后的最大快乐值. 思路:先来一段来自出题人的题解: 显然的贪心:如果 ...
- 湖南省第十二届省赛:Parenthesis
Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions. The i-t ...
- 福州大学第十届校赛 & fzu 2128最长子串
思路: 对于每个子串,求出 母串中 所有该子串 的 开始和结束位置,保存在 mark数组中,求完所有子串后,对mark数组按 结束位置排序,然后 用后一个的结束位置 减去 前一个的 开始 位置 再 减 ...
- 第十二届湖南省赛G - Parenthesis (树状数组维护)
Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of length n and q questions. The i-th questio ...
- 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题
Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...
- 第十二届湖南省赛 A - 2016 ( 数学,同余转换)
给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input 输入包含不超过 30 ...
- 浙江省第十二届省赛 Beauty of Array(思维题)
Description Edward has an array A with N integers. He defines the beauty of an array as the summatio ...
随机推荐
- 跨域知识(一)——CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...
- Pyhton 单行、多行注释方法
一.python单行注释的符号 井号#常被用作单行注释符号,在代码中使用#时,它右边的任何数据都会被忽略,当做是注释.类似c++的// 二.批量.多行注释的符号 多行注释是用三引号: ”’ 注释内容 ...
- 【JZOJ4848】【GDOI2017模拟11.3】永恒的契约
题目描述 宅邸迅速的燃烧着,必须带贝蒂走出禁书库!凭着感觉,又一次直接找到禁书库的门. "你,是那个人嘛?"400年了,当初圣域建立结界时没有进入圣域,被伤了心的人工精灵贝蒂,与强 ...
- jenkins使用教程!
http://jenkins-ci.org/ 首先去官方下载war包,直接安装jenkins的方式比较麻烦. 下载tomcat,jdk和ant cd /optwget http://mirrors.h ...
- 通过JS操作CSS
动态效果如图所示: 第一种实现方法: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- sql函数的使用——转换函数
转换函数用于将数据类型从一种转为另外一种,在某些情况下,oracle server允许值的数据类型和实际的不一样,这时oracle server会隐含的转化数据类型,比如: create table ...
- sqlite数据库文件导入到sqlserver 2016-03-26 21:55 1292人阅读 评论(1) 收藏
最近在公司做项目,需要做两个版本,都是cs的,然后要求是一个单机版,自带数据库,另一个要进行局域网内的连接,所以公司的大牛设计是,局域网版的用sqlserver2008,单机版的则用sqlite.然后 ...
- MUI - 为textarea添加语音输入和清除的功能
为textarea添加语音输入和清除的功能 mui支持input输入框语音输入和清除的功能,只需要添加相关css类即可. http://www.cnblogs.com/phillyx/ 代码如下 &l ...
- poj 1085 Triangle War (状压+记忆化搜索)
Triangle War Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2685 Accepted: 1061 Desc ...
- 17-1 djanjo进阶-路由,视图,模板
一 路由系统进阶(urls.py) 动态路由 urls.py中通过正则表达式的分组匹配,捕获用户访问的url中的值,传递给视图函数1 分组匹配(通过圆括号): 相当于给视图函数传递 位置参数 例子: ...