2017-10-3 清北刷题冲刺班a.m
P99
zhx
a
【问题描述】
你是能看到第一题的 friends 呢。
——hja
怎么快速记单词呢?也许把单词分类再记单词是个不错的选择。何大爷给
出了一种分单词的方法,何大爷认为两个单词是同一类的当这两个单词的各个
字母的个数是一样的,如 dog 和 god。现在何大爷给了你?个单词,问这里总共
有多少类单词。
【输入格式】
第一行一个整数?代表单词的个数。
接下来?行每行一个单词。
【输出格式】
一行一个整数代表答案。
【样例输入】
3
AABAC
CBAAA
AAABB
【样例输出】
2
【数据范围与规定】
70%的数据,1 ≤ ? ≤ 100。
对于100%的数据,1 ≤ ? ≤ 10000,所有单词由大写字母组成。
#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 100000003
using namespace std;
int su[]={,,,,,,,,,,,,,,,,,,,,,,,,,};
int n,cnt;
bool vis[];
string s;
int main(){
//freopen("Cola.txt","r",stdin);
freopen("a.in","r",stdin);freopen("a.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
long long now=;
s="";
cin>>s;
int len=s.length();
for(int j=;j<len;j++)
now=1LL*now*su[s[j]-'A']%mod;
if(!vis[now]){
cnt++;
vis[now]=;
}
}
printf("%d",cnt);
fclose(stdin);fclose(stdout);
return ;
}
100分 唯一分解定理
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 。
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int main(){
freopen("b.in","r",stdin);freopen("b.out","w",stdout);
scanf("%d",&n);
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<;
if(n==)cout<<; fclose(stdin);fclose(stdout);
return ;
}
30分 打表
/*
f[g]:以g为周长,并且三边gcd为1的三角形个数
h[n/g]:把n/g分配给任意多个三角形的方案数
把x个物品分配给任意多个三角形的方案数为2^(x-1)
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=;
const int mo=; int n,cnt,f[maxn],er[maxn],divisor[maxn]; #define inc(a,b) a+=b,(a>=mo ? a-=mo : 0) int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
scanf("%d",&n);
for (int a=;a<=n;a++)
f[a]=f[a-],inc(f[a],a/-a/);
for (int a=;a*a<=n;a++)
if (n % a==)
{
cnt++;
divisor[cnt]=a;
if (a*a!=n)
{
cnt++;
divisor[cnt]=n/a;
}
}
sort(divisor+,divisor+cnt+);
for (int a=;a<=cnt;a++)
for (int b=;b<a;b++)
if (divisor[a] % divisor[b]==) inc(f[divisor[a]],mo-f[divisor[b]]);
er[]=;
for (int a=;a<=n;a++)
er[a]=er[a-],inc(er[a],er[a-]);
int ans=;
for (int a=;a<=cnt;a++)
inc(ans,(long long)f[divisor[a]]*er[n/divisor[a]-]%mo);
printf("%d\n",ans); return ;
}
100分
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,每列最大高度不超过10000。
#include<iostream>
#include<cstdio>
#define mod 1000000009
#define maxn 51
using namespace std;
int a[maxn],b[maxn],n,m,mx[maxn][maxn],ans,now[maxn][maxn];
int mxx[maxn],mxy[maxn];
bool check(){
for(int i=;i<=n;i++)
if(mxx[i]!=a[i])return ;
for(int i=;i<=m;i++)
if(mxy[i]!=b[i])return ;
return ;
}
void dfs(int x,int y){
if(y==m+&&mxx[x]!=a[x])return;
if(x==n&&y>&&mxy[y-]!=b[y-])return;
if(y>m)y=,x++;
if(x>n){
if(check())ans++;
if(ans>=mod)ans-=mod;
return;
}
int mx1,mx2;
for(int i=;i<=mx[x][y];i++){
now[x][y]=i;
mx1=mxx[x];mx2=mxy[y];
mxx[x]=max(mxx[x],i);
mxy[y]=max(mxy[y],i);
dfs(x,y+);
mxx[x]=mx1;mxy[y]=mx2;
}
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("c.in","r",stdin);freopen("c.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=m;i++)scanf("%d",&b[i]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
mx[i][j]=min(a[i],b[j]);
dfs(,);
printf("%d",ans);
fclose(stdin);fclose(stdout);
return ;
}
10分 暴力
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define LL long long
#ifdef unix
#define RE "%lld"
#else
#define RE "%I64d"
#endif
using namespace std;
const int VAL = , MAXN = , mo = 1e9 + ;
int n, m, a[VAL], b[VAL];
int c[MAXN][MAXN];
void init_c(int n) {
for (int i = ; i <= n; ++ i)
c[i][] = c[i][i] = ;
for (int i = ; i <= n; ++ i)
for (int j = ; j < n; ++ j)
c[i][j] = (c[i-][j-] + c[i-][j]) % mo;
}
int modpow(int a, int b) {
int res = , q = a;
while (b) {
if (b & ) res = 1ll * res * q % mo;
q = 1ll * q * q % mo;
b >>= ;
}
return res;
}
int calc(int n, int m, int nn, int mm, int h) {
int res = ;
for (int i = ; i <= nn; ++ i)
for (int j = ; j <= mm; ++ j) {
int tmp = 1ll * modpow(h, n * m - (n - i) * (m - j)) * modpow(h+,(n-i)*(m-j)-(n-nn)*(m-mm)) % mo
* c[nn][i] % mo * c[mm][j] % mo;
if ((i + j) & ) res = ((res - tmp) % mo + mo ) % mo;
else {
res += tmp; if (res >= mo) res -= mo; }
}
return res;
}
int main() {
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
scanf("%d%d", &n, &m);
for (int i = , x; i <= n; ++ i)
scanf("%d", &x), a[x] ++;
for (int i = , x; i <= m; ++ i)
scanf("%d", &x), b[x] ++;
init_c(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 * calc(nown, nowm, a[i], b[i], i) % mo;
}
printf(RE"\n", res);
return ;
}
100分 容斥原理
2017-10-3 清北刷题冲刺班a.m的更多相关文章
- 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-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题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...
- 2017-10-7 清北刷题冲刺班a.m
测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...
- 2017-10-1 清北刷题冲刺班a.m
位运算1 (bit) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥 ...
随机推荐
- name lookup of 'res' changed for new ISO 'res' scoping
#include<iostream> using namespace std; int pow ( int val, int exp ); int main() { int val = 2 ...
- Selenium-多窗口处理
弹出新的窗口,该如何处理 1.获取当前窗口句柄 2.元素的操作,打开新的窗口 3.获取所有窗口句柄 4.for循环遍历所有窗口,定位到需要操作的窗口上 和你当前句柄不一样的就说明是新的,通过打印tit ...
- Selenium-浮层的操作
实现-百度登录浮层-输入登录用户名 #! /usr/bin/env python #coding=utf-8 ''' 百度首页-登录浮层 ''' from selenium import webdri ...
- Java---变量与常量
Java中的关键字 Java 语言中有一些具有特殊用途的词被称为关键字.关键字对 Java 的编译器有着特殊的意义,在程序中应用时一定要慎重 Java标识符 标识符就是用于给 Java 程序中变量.类 ...
- 使用命令行生成 APNG 图片
使用 apngasm 工具 下载地址 https://sourceforge.net/projects/apngasm/files/2.91/ 本地源码编译 make 或者 下载对应环境的可执行程序 ...
- poj2661 Factstone Benchmark(大数不等式同取对数)
这道题列出不等式后明显是会溢出的大数,但是没有必要写高精度,直接两边取对数(这是很简明实用的处理技巧)得: log2(n!)=log2(n)+log2(n-1)+...+log2(1)<=log ...
- 尴尬的app:layout_scrollFlags="scroll|enterAlways" 配合NavigationDrawer
昨天想到了NavigationDrawer中Item点击的问题. 点击Drawer中的一个Item需要到一个新的页面,你是应该打开一个新的Activity呢还是直接用fragment呢? 如果打开新的 ...
- TS学习之解构与展开
一.解构 1.解构数组 let input = [1, 2]; let [first, second] = input; console.log(first); // outputs 1 consol ...
- 使用SVG + CSS实现动态霓虹灯文字效果
效果图: 原理:多个SVG描边动画使用不同的animation-delay即可! 对于一个形状SVG元素或文本SVG元素,可以使用stroke-dasharray来控制描边的间隔样式,并且可以用str ...
- IIS备份和还原
当我们电脑系统有大量的站点和虚拟目录的时候,电脑因为种种原因需要重做系统,那么重装系统后这些站点我们是否只能一个一个的添加,如果有成百上千个站点呢,任务量可想而知,本文将介绍如何备份和还原window ...