清北刷题班day3 morning
P99
zhx
: 竞赛时间:???? 年?? 月?? 日??:??-??:??
题目名称 a b c
名称 a b c
输入 a.in b.in c.in
输出 a.out b.out c.out
每个测试点时限 1s 1s 1s
内存限制 256MB 256MB 256MB
测试点数目 10 10 10
每个测试点分值 10 10 10
是否有部分分 无 无 无
题目类型 传统 传统 传统
注意 事项) (请务必仔细阅读) :
P99 zhxa
a
【问题描述】
你是能看到第一题的 friends 呢。
——hja
怎么快速记单词呢?也许把单词分类再记单词是个不错的选择。何大爷给
出了一种分单词的方法,何大爷认为两个单词是同一类的当这两个单词的各个
字母的个数是一样的,如 dog 和 god。现在何大爷给了你?个单词,问这里总共
有多少类单词。
【输入格式】
第一行一个整数?代表单词的个数。
接下来?行每行一个单词。
【输出格式】
一行一个整数代表答案。
【样例输入】
3
AABAC
CBAAA
AAABB
【样例输出】
2
【数据范围与规定】
70%的数据,1 ≤ ? ≤ 100。
对于100%的数据,1 ≤ ? ≤ 10000,所有单词由大写字母组成。
P99 zhxb
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<cstdlib>
#include<algorithm> #define N 10007 using namespace std;
int len,n;
string ch;
set<string>s; int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
cin>>n;
for(int k=;k<=n;k++)
{
cin>>ch;len=ch.length();
sort(ch.begin(),ch.end());
s.insert(ch);
}
printf("%d\n",s.size());
fclose(stdin);fclose(stdout);
return ;
}
b
【问题描述】
你是能看到第二题的 friends 呢。
——laekov
长度为?的铁丝,你可以将其分成若干段,并把每段都折成一个三角形。你
还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的
分法。
【输入格式】
一行一个整数?。
【输出格式】
一行一个整数代表答案对10 9 + 7取模之后的值。
【样例输入 1
6
【样例输出 1】
2
【样例输入 2】
9
【样例输出 2】
6
【样例解释 2】
(1,1,1),(2,2,2);(2,2,2),(1,1,1)算两种方案。
【数据范围与规定】
3。
60%的数据,1 ≤ ? ≤ 1000。
对于100%的数据,1 ≤ ? ≤ 10 6 。
P99 zhxc
/*
首先计算周长为M的三角形有多少个,设为f[M]。设三角形的三边a,b,c满足a<=b<=c,那么分两种情况:
(1)b=c,此时c的上限为(M-1)/2,下限为ceil(M/3)=(M+2)/3,所以此时的三角形个数为(M-1)/2-(M+2)/3+1;
(2)b!=c,那么b<=c-1,因为a+b>c>c-1,因此一般来说有多少个三角形(a,b,c-1)就有多少个三角形(a,b,c),但是此时要减去a+b=c的情况。三角形(a,b,c-1)的个数就是f[M-1]。此时若a+b=c,即M-1=a+b+c-1=c+c-1,即M=2c,因此M必须为偶数。a+b=c=M/2,使得a+b=M/2的有序(a<=b)二元组有M/2/2。
根据这两个可以得到计算f的递推关系。下面我们看怎么得到周长为M且三边满足Gcd(a,b,c)=1的三角形个数?这个可用于筛素数类似的方法得到。那么对于n,将其分成若干份,每份相等,那么不同的分法就是隔板法。
①相似三角形一定可以找到最小的那个,称为这类相似三角形的基。
②剩下就是一包夹杂容斥的递推:
③设w[i]为长度为i的铁丝的分法,一种分法的所有三角形边长除以gcd(a,b,c)得到的三角形都一样,且三边互质,设边长为a',b',c'。?
④若M=a+b+c,M'=a'+b'+c',设k=M/M',那么以a',b',c'为三边的三角形为基,用长度为M的铁丝能做出的方案数为2^(k-1) (杨辉三角第k层数字和公式)。?
⑤设g[i]为长度为i的铁丝分成边长为a,b,c(a<=b<=c)且gcd(a,b,c)=1的三角形的方案数。那么
w[i]=g[p1]*2^(i/p1-1)+g[p2]*2^(i/p2-1)+…+g[pk]*2^(i/pk-1)(p为i的因数)。?
⑥设f[i]为长度为i的铁丝分成边长为a,b,c(a<=b<=c)的三角形的方案数。那么
g[i]=f[i]-f[p1]-f[p2]-…-f[pk](p为i的因数)。(注意此处的f相当于g了,因为是f在刷新自己,因此不会出现因倍数而导致重复情况)
⑦接下来处理三角形三边合法(即f的递推):
1.b==c,c最小为ceil(i/3),最大为floor((i-1)/2) 。?
2.b<=b<=c-1的方案数,为f[i-1]。?
第二种情况还要除去a+b=c的方案数。?
若a+b=c,那么i=a+b+c=2*(a+b),a+b=i/2,
这样的(a,b)有i/2/2对,此时i一定为偶数,所以i为偶数时要考虑这种情况
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=,mod=;
int n,ans,cnt;
int f[N],p[N];
int main()
{
p[]=;
for(int i=; i<=N; i++)p[i]=(p[i-]*)%mod;
f[]=;
for(int i=; i<=N; i++)
{
f[i]=f[i-]+(i-)/-i/+(i%?:);
if(i%==)f[i]-=i/;
f[i]%=mod;
if(f[i]<)f[i]+=mod;
}
for(int i=; i<=N; i++)
for(int j=; i*j<=N; j++)
{
f[i*j]-=f[i];
if(f[i*j]<)f[i*j]+=mod;
}
while(~scanf("%d",&n))
{
ans=;
for(int i=; i*i<=n; i++)
{
if(n%i!=)continue;
ans=(ans+1ll*f[i]*p[n/i])%mod;
if(i*i!=n)ans=(ans+1ll*f[n/i]*p[i])%mod;
}
printf("%d\n",ans);
}
return ;
}
c
【问题描述】
你是能看到第三题的 friends 呢。
——aoao
在小学的时候,我们都学过正视图和左视图。现在何大爷用一些小方块摆了
一个图形,并给出了你这个图形的左视图和正视图。现在何大爷希望知道,在给
定正视图和左视图的情况下,原来的立体图形有多少种可能的情况?
【输入格式】
第一行两个整数?,?,代表在左视图和正视图中分别有多少列。
第二?个整数,代表在左视图中从左至右每一列的高度。
第三行?个整数,代表在正视图中从左至有每一列的高度。
【输出格式】
一行一个整数代表答案对10 9 + 9取模之后的值。
【样例输入 1】
2 2
1 1
1 1
【样例输出 1】
7
【样例输入 2】
4 5
5 2 4 1
5 2 4 0 1
【样例输出 2】
429287
【数据规模与约定】
21 ≤ ?,? ≤ 5,每列的最大高度不超过5。
40%的数据,? + ? ≤ 18。
对于100%的数据,1 ≤ ?,? ≤ 50,每列最
/*
排序
容斥原理
emmmmm
大概就是这么牛逼
大佬的世界
我们不懂
不懂
不懂
就是不懂
嘿嘿嘿
不懂
绝望
就是不懂
很绝望
看不懂
emmmm
*/
#include<cstdio>
#include<algorithm> using namespace std; typedef long long LL; #define N 51
#define H 10001
const int mod=1e9+; int a[H],b[H];
int n,m;
int C[N][N]; void pre(int k)
{
for(int i=; i<=k; i++) C[i][]=;
for(int i=; i<=k; i++)
for(int j=; j<=i; j++)
C[i][j]=(C[i-][j]+C[i-][j-])%mod;
} int pow(int a,int b)
{
int res=;
for(; b; b>>=,a=1ll*a*a%mod)
if(b&) res=1ll*res*a%mod;
return res;
} int cal(int n,int m,int nn,int mm,int h)
{
int res=,tmp;
for(int i=; i<=nn; ++i)
for(int j=; j<=mm; ++j)
{
tmp=1ll*pow(h,n*m-(n-i)*(m-j))*pow(h+,(n-i)*(m-j)-(n-nn)*(m-mm))%mod*C[nn][i]%mod*C[mm][j]%mod;
if((i+j)&) res=((res-tmp)%mod+mod)%mod;
else res+=tmp,res%=mod;
}
return res;
} int main()
{
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
int x;
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i) scanf("%d",&x),a[x]++;
for(int i=; i<=m; ++i) scanf("%d",&x),b[x]++;
pre(max(n,m));
LL res=;
int nown=,nowm=;
for(int i=; i>=; i--)
if(a[i] || b[i])
{
nown+=a[i];
nowm+=b[i];
res=1ll*res*cal(nown,nowm,a[i],b[i],i)%mod;
}
printf("%I64d",res);
}
清北刷题班day3 morning的更多相关文章
- 10.27night清北刷题班
/* 枚举每个部分的总和,利用前缀和进行检验. 如果能分成4部分就一定能分成2部分,就筛了一边素数优化.清空数组!!! */ #include<bits/stdc++.h> #define ...
- 2017-10-4 清北刷题冲刺班p.m
P102zhx a [问题描述]你是能看到第一题的 friends 呢.——hja两种操作:1.加入一个数.2.询问有多少个数是?的倍数.[输入格式]第一行一个整数?,代表操作数量.接下来?行,每行两 ...
- 2017-10-4 清北刷题冲刺班a.m
P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...
- 2017-10-3 清北刷题冲刺班p.m
a [问题描述]你是能看到第一题的 friends 呢.——hja给你一个只有小括号和中括号和大括号的括号序列,问该序列是否合法.[输入格式]一行一个括号序列.[输出格式]如果合法,输出 OK,否则输 ...
- 2017-10-3 清北刷题冲刺班a.m
P99zhx a [问题描述]你是能看到第一题的 friends 呢.——hja怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两 ...
- 2017-10-2 清北刷题冲刺班a.m
一道图论神题 (god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只 ...
- 2017-10-2 清北刷题冲刺班p.m
最大值 (max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n ...
- 2017-10-1 清北刷题冲刺班p.m
一道图论好题 (graph) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...
- 2017-10-7 清北刷题冲刺班p.m
测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...
随机推荐
- datatable 分组
public static void PrintPersons() { //准备数据 DataTable dt = new DataTable(); dt.Columns.Add(new DataCo ...
- HDU - 2050 - 折线分割平面(数学 + dp)
题意: 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分 思路: 记住结论.. ...
- python下载网络文件
python下载网络文件 制作人:全心全意 下载图片 #!/usr/bin/python #-*- coding: utf-8 -*- import requests url = "http ...
- LINUX-文件系统分析
badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 fsck.ext2 /dev/hda1 修 ...
- Android 找不到资源的问题
偶尔会遇到R.layout.***或R.id.***找不到资源的问题,明明在文件夹中有啊,那为什么嘞? 结合我自己遇到的情况和网上的资料,总结出以下几点可能的原因: 导入了android.R.这个是最 ...
- String与StringBuffer,StringBuilder
在java中有3个类来负责字符的操作. 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作.不可变类. 3.StringBuffer 也是对一串字符进行操作,但是可变 ...
- image url to base64
image url to base64 https://www.base64-image.de/ https://www.browserling.com/tools/image-to-base64 h ...
- 解决使用myeclipse电脑卡的问题
1. 原因:myeclipse会自动更新,因此会占用大量内存 2. 解决方法: (1)window->Perferences->General->Startup and Shutdo ...
- 洛谷——P1103 书本整理
https://www.luogu.org/problem/show?pid=1103 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所 ...
- 洛谷——P1255 数楼梯
题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入输出格式 输入格式: 一个数字,楼梯数. 输出格式: 走的方式几种. 输入输出样例 输入样例# ...