记2018/4/29 qbxt 测试
记 2018/4/29 qbxt 测试(提高基础班)
简单的 NOIP 模拟赛
竞赛时间: 2018 年 4 月 29 日 13:30-17:00
题目名称 | 乘法 | 求和 | 计数 |
输入文件名 | mul.in | sum.in | count.in |
输出文件名 | mul.out | sum.out | count.in |
每个测试点时限 | 1 sec | 4 sec | 1 sec |
内存限制 | 128MB | 128MB | 128MB |
测试点数目 | 10 | 10 | 10 |
每个测试点分值 | 10 | 10 | 10 |
是否有部分分 | 无 | 无 | 无 |
题目类型 | 传统 | 传统 | 传统 |
T1 期望得分:100;实际得分:100
乘法
【问题描述】
给定正整数n,m,p,你需要输出 n * m 对 p 取模后的值
【输入文件】
输入文件为 mul.in
输入为一行 n, m, p
【输出文件】
输出文件为 mul.out
输出一行为一个整数,为所求的答案
【输入输出样例】
mul.in | mul.out |
11 22 10 | 2 |
【数据规模和约定】
对于30%的数据,n, m, p <=10000;
对于60%的数据,n, m, p <= 109
对于100%的数据, n, m, p <= 1018
【一些提示】
以下是一些对取模操作的介绍:
一个整数a对一个整数p取模的值,是一个不超过p的非负整数b,并且a-b是p的倍数。可以证明,满足条件的b有且只有一个;
一些运算在取模前后仍然成立,例如:
两个数的和对p取模的值等于两个数先对p取模,再求和,在取模;
两个数的乘积对p取模的值等于两个数先对p取模,再求乘积,再取模
但两个数的除法没有类似的性质
思路:快速乘(类似于快速幂) or 高精
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n, m, p;
long long Mul(long long x, long long y){
long long res = ;
x %= p; y %= p;
while(y) {
if(y & ) res = (res+x) % p;
x = (x+x) % p;
y >>= ;
}
return res;
}
int main() {
//freopen("mul.in","r",stdin);
//freopen("mul.out","w",stdout);
cin >> n >> m >> p;
cout<< Mul(n, m);
//fclose(stdin); fclose(stdout);
return ;
}
快速乘
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
namespace BigInteger
{
#define maxn 10005
using std::sprintf;
using std::string;
using std::max;
using std::istream;
using std::ostream; struct Big_integer
{
int d[maxn],len;
void clean()
{
while(len>&&!d[len-])
len--;
}
Big_integer()
{
memset(d,,sizeof(d));
len=;
}
Big_integer(int num)
{
*this=num;
}
Big_integer(char* num)
{
*this=num;
}
Big_integer operator = (const char* num)
{
memset(d,,sizeof(d));
len=strlen(num);
for(int i=;i<len;i++)
d[i]=num[len--i]-'';
clean();
return *this;
}
Big_integer operator = (int num)
{
char s[];
sprintf(s,"%d",num);
*this=s;
return *this;
}
Big_integer operator + (const Big_integer& b)
{
Big_integer c=*this;
int i;
for(i=;i<b.len;i++)
{
c.d[i]+=b.d[i];
if(c.d[i]>)
{
c.d[i]%=;
c.d[i+]++;
}
}
while(c.d[i]>)
{
c.d[i++]%=;
c.d[i]++;
}
c.len=max(len,b.len);
if(c.d[i]&&c.len<=i)
c.len=i+;
return c;
}
Big_integer operator - (const Big_integer& b)
{
Big_integer c=*this;
int i;
for(i=;i<b.len;i++)
{
c.d[i]-=b.d[i];
if(c.d[i]<)
{
c.d[i]+=;
c.d[i+]--;
}
}
while(c.d[i]<)
{
c.d[i++]+=;
c.d[i]--;
}
c.clean();
return c;
}
Big_integer operator * (const Big_integer& b) const
{
int i,j;
Big_integer c;
c.len=len+b.len;
for(j=;j<b.len;j++)
for(i=;i<len;i++)
c.d[i+j]+=d[i]*b.d[j];
for(i=;i<c.len-;i++)
{
c.d[i+]+=c.d[i]/;
c.d[i]%=;
}
c.clean();
return c;
}
Big_integer operator % (const Big_integer& b)
{
int i,j;
Big_integer a=;
for(i=len-;i>=;i--)
{
a=a*+d[i];
for(j=;j<;j++)
if(a<b*(j+))
break;
a=a-b*j;
}
return a;
}
bool operator < (const Big_integer& b) const
{
if(len != b.len) return len<b.len;
for(int i=len-;i>=;i--)
if(d[i]!=b.d[i])
return d[i]<b.d[i];
return false;
}
string str()const
{
char s[maxn]={};
for(int i=;i<len;i++)
s[len--i]=d[i]+'';
return s;
}
};
istream& operator >> (istream& in,Big_integer& x)
{
string s;
in>>s;
x=s.c_str();
return in;
} ostream& operator << (ostream& out,const Big_integer& x)
{
out<<x.str();
return out;
}
}
using namespace BigInteger;
using namespace std;
Big_integer a,b,k;
int main()
{
//freopen("mul.in","r",stdin);
//freopen("mul.out","w",stdout);
cin>>a>>b>>k;
cout<<a*b%k;
//fclose(stdin);
//fclose(stdout);
return ;
}
高精
T2 期望得分:30;实际得分:0 qwq
求和
【题目描述】
给定n个正整数d1 , d2 , d3 ..... dn。如果取出其中的任意两个数(可以相同) ,则可以得到这两个数的和。对于n个数,则至多可以产生n*(n + 1) / 2 种不同的和。
给出正整数 m,你需要判断: 是否存在两个整数 u, v , 满足 du + dv = m.
【输入文件】
输入文件为 sum. in。
本题一个输入中包含多组数据。 输入第一行为一个整数 T , 表示数据组数。对于每组数据, 输入的第一行为两个正整数 n, m,输入的第二行为 n 个正整数 d1, d2, d3 ..... dn
【输出文件】
输入文件为 sum.out。
输出 T 行, 每行一个整数。 如果正整数 u, v 存在, 则输出 1; 否则输出 0。
【输入输出样例】
sum.in | sum.out |
2 3 3 2 3 4 3 4 1 2 4 |
0 1 |
【数据规模和约定】
对于30%的数据,满足 n <= 1000, m <= 10000;
对于60%的数据,满足 n <= 105;
对于另30%的数据,满足 m <= 107;
对于100%的数据,满足 1 <= n <= 106, 1 <= di <= 109, 1 <= T <= 20.
【一些提示】
在下发文件中附有文件 sample.cpp, 包含了自定义函数 read()及其使用示例。 对于本题,请务必使用 read()函数进行读入, 否则可能会有时间的问题。
思路: 30 分: 暴力
60 分: 排序后, 两根指针进行扫᧿。
另 30 分: 用计数数组记录数的分布
100 分: 在使用计数数组的基础上进行拓展。考虑设置一个数 b ,把每个di 写成 di = ai * b + ri ;并且把每个 di 按 ai 的值分成若干组,ai 相同的数放在一组里。
考虑一次性处理某一组的数。 如果假设 du + dv = m 的一个数在某一组中,那么另一个数的分布范围一定不超过两组。 所以, 如果要检测某一组的数是否可以作为一个加数, 只需要把另外的两组放入计数数组即可。 这样就解决了计数数组开不下的问题。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
typedef vector<int>::iterator iter;
const int N = , M = ;
int d[N];
int a[M];
vector<int> block[M];
int cnt[M * ];
int read()
{
int x=;char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x;
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
setvbuf(stdin, new char[ << ], _IOFBF, << );
setvbuf(stdout, new char[ << ], _IOFBF, << );
int T = read();
while (T--)
{ int n = read(), m = read();
int maxblock = m / M;
int ans = ;
for (int i = ; i <= maxblock; i++)
block[i].clear();
int tmptme = clock();
while (n--)
{
int x = read();
int y = x % M;
x /= M;
block[x].push_back(y);
}
for (int i = ; i <= maxblock; i++)
{
int lblock = (m - (i + ) * M + ) / M;
int rblock = (m - i * M) / M;
int base = lblock * M;
for (int j = lblock; j <= rblock; j++)
{
for (iter it = block[j].begin(); it != block[j].end(); it++)
{
cnt[*it + j * M - base] = ;
}
}
for (iter it = block[i].begin(); it != block[i].end(); it++)
{
if (cnt[m - i * M - *it - base])
{
ans = ;
break;
}
}
for (int j = lblock; j <= rblock; j++)
{
for (iter it = block[j].begin(); it != block[j].end(); it++)
{
cnt[*it + j * M - base] = ;
}
}
if (ans) break;
}
cout << ans << endl;
}
return ;
}
标程
T3 期望得分:40;实际得分:40;
【问题描述】
杨辉三角是一个满足如下条件的三角形矩阵:
边界条件:f [ i ] [ 0 ] = f [ i ] [ i ] = 1 , i >= 0 .
其余部分:f [ i ] [ j ] = f [ i - 1 ] [ j - 1 ] + f [ i - 1 ] [ j ] , 如果( i, j )不在边界上
由此可以得出杨辉三角的前5行大致如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
现在,给定正整数n你需要计算杨辉三角前n行有多少个偶数
【输入文件】
输入文件为 count.in。
输入文件为一行一个正整数n。
【输出文件】
输入文件为 cs.out。
输出一行一个整数, 为杨辉三角前n行的偶数个数。
【输入输出样例】
5 4
【数据规模和约定】
对于40%的数据,满足n<=1000。
对于70%的数据,满足n<=106。
对于90%的数据,满足n<=109。
对于100%的数据,满足n<=10100。
思路:杨辉三角的奇偶分布是一个经典的分形图形。 由此可以观察出的规律有:杨辉三角的前 2n 行的奇数个数是 3n 个,如果找到一个 k,使 2k <= n < 2k-1, 那么前 2k 行的奇数个数可以单独计算; 而余下部分两边对称, 所以可以递归算其中的一边, 再乘以 2 加入答案。
上述算法计算出的是杨辉三角前 n 行有多少个奇数, 作差即可得到偶数的个数。
对于最后一个测试点, 需要使用高精度来支持上述做法。
#include<algorithm>
#include<cstdio>
using namespace std;
int n, sum;
int a[][]; int main() {
//freopen("count.in","r",stdin);
//freopen("count.out","w",stdout);
scanf("%d", &n);
a[][] = ;
for(int i = ; i < n; i++)
for(int j = ; j < i+; j++) {
if(i == ) a[i][j] = ;
else a[i][j] = a[i-][j-]+a[i-][j];
if(a[i][j]% == ) sum++;
}
printf("%d", sum);
//fclose(stdin); fclose(stdout);
return ;
}
40分暴力
#include<iostream>
using namespace std;
long long n;
long long work(long long n)
{
if(n== || n== )return ;
if(n&)return *work(n/)+work(n/+)+(n/)*(n/+)/;
else return *work(n/)+(n/)*(n/-)/;
}
int main()
{
//freopen("count.in","r",stdin);
//freopen("count.out","w",stdout);
cin>>n;
cout<<work(n);
//fclose(stdin);fclose(stdout);
return ;
}
90分递归 没有高精
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
const int N = ; struct bignum
{
int a[N];
int n;
bignum()
{
n = ;
memset(a, , sizeof(a));
}
bignum(string s)
{
memset(a, , sizeof(a));
n = s.size();
for (int i = ; i < n; i++)
a[i] = s[n - - i] -'';
}
bignum(int x)
{
memset(a, , sizeof(a));
n = ;
while (x)
{
a[n] = x % ;
x /= ;
n++;
}
}
void deal()
{
for (int i = ; i < n; i++)
{
if (a[i] < )
{
int tmp = (-a[i] - ) / + ;
a[i] += * tmp;
a[i + ] -= tmp;
}
if (a[i] >= )
{
int tmp = a[i] / ;
a[i] -= * tmp;
a[i + ] += tmp;
if (i == n - && a[i + ] > ) n++;
}
}
while (n > && a[n - ] == ) n--;
}
void div2()
{
int tmp = ;
for (int i = n - ; i >= ; i--)
{
int tmp_ = a[i] & ;
a[i] = (a[i] + tmp * ) >> ;
tmp = tmp_;
}
deal();
}
void print()
{
for (int i = n - ; i >= ; i--)
cout << a[i];
cout << endl;
}
}; bignum operator + (const bignum &a, const bignum &b)
{
bignum c;
c.n = max(a.n, b.n);
for (int i = ; i < c.n; i++)
c.a[i] = a.a[i] + b.a[i];
c.deal();
return c;
} bignum operator - (const bignum &a, const bignum &b)
{
bignum c;
c.n = max(a.n, b.n);
for (int i = ; i < c.n; i++)
c.a[i] = a.a[i] - b.a[i];
c.deal();
return c;
} bignum operator * (const bignum &a, const bignum &b)
{
bignum c;
c.n = a.n + b.n - ;
for (int i = ; i < a.n; i++)
for (int j = ; j < b.n; j++)
c.a[i + j] += a.a[i] * b.a[j];
c.deal();
return c;
}
bool no_bigger_than(const bignum &a, const bignum &b)
{
if (a.n < b.n) return ;
if (b.n < a.n) return ; for (int i = a.n - ; i >= ; i--)
{
if (a.a[i] > b.a[i]) return ;
if (a.a[i] < b.a[i]) return ;
}
return ;
} bignum calc(bignum n)
{
if (n.n == ) return ;
bignum ret();
bignum now();
bignum big2();
bignum big3();
while (no_bigger_than(now * big2, n))
{
now = now * big2;
ret = ret * big3; }
/*
cout << "*****" << endl;
n.print();
now.print();
ret.print();
cout << "*****" << endl;
*/
return ret + big2 * calc(n - now);
} int main()
{
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
string s;
cin >> s;
bignum a(s);
bignum n(s);
bignum b();
//b.print();
bignum c = a + b;
//a.print();
//c.print();
//return 0;
a = a * c;
//a.print();
a.div2();
//a.print();
(a - calc(n)).print();
return ;
}
标程
附加题:HDU 矩形面积并
记2018/4/29 qbxt 测试的更多相关文章
- 记2018/5/5 qbxt 测试
记2018/5/5 qbxt 测试 竞赛时间: 2018 年 5 月 5 日 13:30-17:00 T1 一.maze(1s,512MB): 简单的迷宫问题:给定一个n*m的迷宫,.表示可以通过,# ...
- 2018/8/21 qbxt测试
2018/8/21 qbxt测试 期望得分:0? 实际得分:0 思路:manacher 会写模板但是不会用 qwq 听了某人的鬼话,直接输出0,然后就gg了 #include <cstdio ...
- 2018/8/15 qbxt 测试
2018/8/15 qbxt 测试 期望得分:100:实际得分:50 不知道为什么写挂了,明明是个水题 T^T 思路:模拟 注意:如果用 char 类型存储的话,如果有'z' + 9 会爆char ...
- 2017年1月3日 星期二 --出埃及记 Exodus 21:29
2017年1月3日 星期二 --出埃及记 Exodus 21:29 If, however, the bull has had the habit of goring and the owner ha ...
- 2016年7月2日 星期六 --出埃及记 Exodus 14:29
2016年7月2日 星期六 --出埃及记 Exodus 14:29 But the Israelites went through the sea on dry ground, with a wall ...
- 【2018.07.29】(深度优先搜索/回溯)学习DFS算法小记
参考网站:https://blog.csdn.net/ldx19980108/article/details/76324307 这个网站里有动态图给我们体现BFS和DFS的区别:https://www ...
- spring ,springmvc,mybatis 最基本的整合,没有多余的jar包和依赖 2018.9.29日
最基本的ssm框架整合 本案例采用2018商业版intellij idea 编辑器 maven项目管理工具 tomcat8.5 接着上一篇使用springmvc最基本配置开始 https: ...
- [转]nginx折腾记(HTTP性能能测试,与Apache对比)
话说nginx在大压力的环境中比apache的表现要好,于是下载了一个来折腾一下. 下载并编译安装,我的编译过程有点特别: 1.去除调试信息,修改$nginx_setup_path/auto/cc ...
- Node.js躬行记(14)——压力测试
公司有个匿名聊天的常规H5界面,运营向做一次 50W 的推送,为了能配合她的计划,需要对该界面做一次压力测试. 一.JMeter 压测工具选择了JMeter,这是Apache的一个项目,它是用Java ...
随机推荐
- 菜鸟之webservice(一) 服务端搭建
首先说一下,为什么取名叫菜鸟之webservice,由于本人技术真的不咋滴,写博客仅仅是为了对所学知识的总结.webservice对于我来说一直都是高大上的感觉,一个java web和javase都没 ...
- Redis封装之List
/// <summary> /// Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销, /// Redis内部的很多实现,包括发 ...
- Cisco交换机解决网络蠕虫病毒入侵问题
Cisco交换机解决网络蠕虫病毒入侵问题 今年来网络蠕虫泛滥给ISP和企业都造成了巨大损失,截至目前已发现近百万种病毒及木马.受感染的网络基础设施遭到破坏,以Sql Slammer为 ...
- SCOPE_IDENTITY()和 SELECT @@IDENTITY 的用法
这俩个,是在插入数据的时候使用,返回刚刚插入数据行的ID 大家慎用@@IDENTITY,而尽量采用 SCOPE_IDENTITY() 函数替换之. SCOPE_IDENTITY() 也是得到最后一条 ...
- rem的解决方案
http://www.qdfuns.com/notes/32967/37b8f127797c6c2b66f2c1dc6d133e45.html rem 作为一个低调的长度单位,由于手机端网页的兴起,在 ...
- JS实现PC端全兼容复制
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 硬件时间,操作系统时间,Windows 和linux 双系统时间差8小时问题说明
1.硬件时间:硬件时钟是存储在主板上CMOS里的时间即BIOS时间,关机后该时钟依然运行,主板的电池为它供电.对应于嵌入式设备有一个RTC模块.硬件时钟即RTC时钟.信息比较少没时区.夏令时的概念. ...
- Hexo 添加自定义的内置标签
灵感 想设计一个记录自已骑行的页面,显示时间.地点.路线图等信息.方便以后做一些留念.定位想实现下面类似的效果.参考:<特效> 实现方案也比较简单,反键查看源码.直接Copy,在 ...
- 最长上升子序列(LIS)nlogn模板
参考https://www.cnblogs.com/yuelian/p/8745807.html 注意最长上升子序列用lower_bound,最长不下降子序列用upper_bound 比如123458 ...
- Dcloud+mui 压缩上传图片到服务器
chooseImgFromAlbums选择图片 chooseImgFromPictures 拍照 changeToLocalUrl 转换成可用的路径 uploadpic.compressImg 压缩图 ...