在jxzz上发现的一个做题网站,每周都有训练题,题目质量……前三题比较水,后面好神啊,而且类型差不多,这周似乎是计数专题……

Army Game

然后给出n*m,问需要多少个小红点能全部占领

解法:乘法。。。

Best Divisor

给一个数,问一个数的约数中数字和最大的约数。

解法:直接分解质因数就可以啦。

Twins

孪生质数定义为两个质数之差为2,问n,m之间有多少个孪生质数(n<=m<=10^9,m-n<=10^6)

解法:显然直接判断区间内相邻的两个奇数是否为质数就可以啦。然而n和m比较大,所以判断是否为质数不能直接用sqrt(n)这样去枚举,可以先用线性筛处理出sqrt(n)的质数,判断的时候直接枚举质数表里面的质数就可以啦。

  #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<stack>
#include<cmath>
#include<map>
#define LL long long
#define maxn 1000100 using namespace std; int n,m,now,sum,prime[maxn],ok[maxn],tot=;
void calc()
{
int i,k;
for (i=;i<maxn;i++) {
if (!ok[i]) prime[tot++]=i;
for (LL j=(LL)(i)*prime[k=];j<maxn;j=i*prime[++k]) {
// printf("%lld %d\n",j,i);
ok[j]=;
if (!(i%prime[k])) break;
}
}
// for (int i=0;i<tot;i++) printf("\t%d",prime[i]);
} int check(int x)
{
if (x==) return ;
for (int i=;i<tot && prime[i]<=sqrt(x);i++)
if (!(x%prime[i])) return ;
return ;
} int main()
{
calc();
scanf("%d %d",&n,&m);
now=,sum=;
if (!(n%)) n++;
for (int i=n;i<=m;i=i+)
if (check(i)) {
if (now) ++sum;
else ++now;
}
else
now=;
printf("%d\n",sum);
return ;
}

Music on the Street

给出一些在数轴点(n<10^6),给出一个长度m(<10^9),再给一个hmin,hmax,找到一个区间使区间内两个点直接的距离大于hmin小于hmax,头尾两个点离区间端点距离大于hmin小于hmax。

解法:队列模拟一下就可以啦。

如果队头的点和当前的点距离大于m就出队,

同时如果当前点和队尾的点不满足距离大于hmin小于hmax,全部出队。

当前点进队

同时记录一个当前左端允许的最左边界=max(上一个出队的点,当前对头-hmax)

然后计算对头允许的区间+m和队尾的点的大于hmin小于hmax有没有交集(判断方法两个区间左端点最大值小于等于两个区间右端点最小值,一直这里判断错,要么就是复杂了……

有的话就是一个合法解啦。

然后要注意一些情况,比如m比hmax小……有可能直接就……

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<stack>
#include<cmath>
#include<map>
#define maxn 1000100
using namespace std; int n,len,hmin,hmax,i,num[maxn];
queue<int> pp; int calc()
{
int lnow,i;
num[]=num[]-hmax-;
lnow=num[];
num[n+]=num[n]+hmax+;
pp.push(i=);
while (++i<=n) {
int last,l1,l2,l3,l4;
while (pp.size() ) {
if (num[i]-num[last=pp.front()]+hmin<=len
&& num[i]-num[pp.back()]<=hmax
&& num[i]-num[pp.back()]>=hmin ) break;
lnow=num[last];
pp.pop();
}
pp.push(i);
last=pp.front();
lnow=max(lnow,num[last]-hmax);
if (num[last]-lnow>=len && len<=hmax) return num[last]-len;
if (pp.size()) {
l1=max(lnow,num[last]-hmax)+len;
l2=num[last]-hmin+len;
l3=num[i]+hmin;
l4=min(num[i+],num[i]+hmax);
if (max(l1,l3)<=min(l2,l4)) return max(l1,l3)-len;
}
}
return -;
} int main()
{
scanf("%d",&n);
for (i=;i<=n;i++) scanf("%d",&num[i]);
scanf("%d %d %d",&len,&hmin,&hmax);
printf("%d\n",calc());
return ;
}

Satisfactory Pairs

ax+by=n(<3*10^5),给出n,问多个对点对(a,b)其中a<b。

解法:太弱了不会……潘学姐给思路了还是不会……

贴题解

意思就是先找出所有数的约数(用vector存起来)

然后公式化为ax=n-by,然后第一层循环枚举b,第二层循环枚举y,然后再枚举(n-by)的约数中小于b的,然后y值不用的时候可能有相同的约数导致重复,所以开个数组储存一个当前这个约数被最新更新的b值,每次判断下这个约数是否已经被b求过,没有的话ans++。

复杂度分析是调和数列求和。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define maxn 301020
#define LL long long
using namespace std; int num[maxn],prime[maxn],p[maxn],tot=;
vector<int> d[maxn];
int n;
void atfirst()
{
int i,j,l;
LL k;
for (i=;i<maxn;i++) {
if (!p[i]) {
p[i]=i;
prime[tot++]=i;
}
for (k=i*prime[j=];j<tot && k<maxn;k=i*prime[++j]) {
p[k]=prime[j];
if (!(i%prime[j])) break;
}
}
d[].push_back();
for (i=;i<maxn;i++) {
int x=i,y=;
while (!(x%p[i])) {
y++;
x/=p[i];
}
for (j=;j<d[x].size();j++)
for (k=d[x][j],l=y;l;l--,k*=p[i])
d[i].push_back(k);
sort(d[i].begin(),d[i].end());
}
} int main()
{
atfirst();
scanf("%d",&n);
memset(num,,sizeof(num));
int ans=;
for (int b=;b<n;b++)
for (int i=;i*b<n;i++) {
int x=n-i*b;
for (int j=;j<d[x].size() &&d[x][j]<b;j++)
if (num[d[x][j]]!=b) {
ans++;
num[d[x][j]]=b;
}
}
printf("%d\n",ans);
return ;
}

Hard Homework

给一个n(3*10^6),求一组x+y+z=n使sin(x)+sin(y)+sin(z).

解法,如果是两个数的和,显然很简单,和差化积就变成2*sin((x+y)/2)cos((x-y)/2),然后只需要知道cos((x-y)/2)的最大值就可以了,这里分情况,和为偶数则最大值显然为cos(0),如果为奇数,x-y的取值范围是(2,n-2),线性就可以求出。

那现在三个数,枚举第一个数,预处理出cos((2,n-2)/2)的最大值,然后就可以一直求出后面两个数的最大值啦。

(然而这思路分析也是受潘学姐的启发,学姐好棒)

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<stack>
#include<cmath>
#include<map>
#define exp 0.0000000001
using namespace std; int n;
int main()
{
scanf("%d",&n);
double num1=-,ans=-exp;
for (int i=n-;i;i--) {
int now=n-i;
double now1;
if (now%) {
double now2=cos((now-)/2.0);
if (now2-num1>=exp) num1=now2;
now1=sin(i)+*sin(now/2.0)*num1;
}
else
now1=sin(i)+*sin((now)/2.0);
if (now1-ans>=exp) ans=now1;
}
printf("%.9lf\n",ans);
return ;
}

Hard Homework

Tastes Like Winning

nim问题,n堆,每堆可能取值为(1-2^m-1),问多少种情况使每堆数量不同且先手胜,n,m<10^9,答案%(10^9+7),(10^9+7)都是神题

解法:不会写,看不懂,

【hackerrank】Week of Code 26的更多相关文章

  1. 【hackerrank】Week of Code 30

    Candy Replenishing Robot Find the Minimum Number 直接模拟 Melodious password dfs输出方案 Poles 题意:有多个仓库,只能从后 ...

  2. 【LeetCode】89.Gary Code

    Problem: The gray code is a binary numeral system where two successive values differ in only one bit ...

  3. 【转】Visual Studio Code必备插件

    先ctrl+shift+p,弹出命令面板-选中Extensions:Install Extensions 或者直接点击左侧栏这个扩展按钮(Ctrl+Shift+X) 然后左侧栏就会显示出很多插件,如图 ...

  4. 【HackerRank】How Many Substrings?

    https://www.hackerrank.com/challenges/how-many-substrings/problem 题解 似乎是被毒瘤澜澜放弃做T3的一道题(因为ASDFZ有很多人做过 ...

  5. 【HackerRank】Running Time of Quicksort

    题目链接:Running Time of Quicksort Challenge In practice, how much faster is Quicksort (in-place) than I ...

  6. 【LeetCode】89. Gray Code

    题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...

  7. 【转】Visual Studio Code 使用Git进行版本控制

    原文链接:https://www.cnblogs.com/xuanhun/p/6019038.html?utm_source=tuicool&utm_medium=referral 本来认为此 ...

  8. 【编辑器】Visual Studio Code

    1.官网:https://code.visualstudio.com/Download 2.插件:https://marketplace.visualstudio.com/VSCode https:/ ...

  9. 【EF】EF框架 Code First Fluent API

    在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreatin ...

随机推荐

  1. SpringBoot-07:SpringBoot整合PageHelper做多条件分页查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述如何在SpringBoot中整合PageHelper,如何实现带多个条件,以及PageInfo中的 ...

  2. PS 拉伸大长腿

    1.打开一个图片工具栏--图像--画布大小 2.选择矩形选框工具--框住要拉升退的位置--然后在按Ctrl+T,进行拉伸即可

  3. poj3984迷宫问题(dfs+stack)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35426   Accepted: 20088 Descriptio ...

  4. ReadyAPI 教程和示例(二)

    声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 接上一篇: 4.修改SoapUI测试 本节将演示如何为测试用例添加测试步骤以及更改请求参 ...

  5. RAP2环境搭建整理(超详细)

    RAP2是阿里开源的接口管理平台,最近搭建了一下,将部署文档整理如下: 如果途中遇坑会在文章末尾记录下来嘻嘻 首先,确定环境是否部署好. RAP2所需的环境为: node.js 8.9.4+ mysq ...

  6. Objective-C 封装 继承 多态

    封装 #import <Foundation/Foundation.h> @interface Person : NSObject { //@public int _age; } - (v ...

  7. 剑指offer-二叉搜索树的后序遍历序列23

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. class Solution: def Verif ...

  8. MyBatis 注解配置及动态SQL

      一.注解配置 目前MyBatis支持注解配置,用注解方式来替代映射文件,但是注解配置还是有点不完善,在开发中使用比较少,大部分的企业还是在用映射文件来进行配置.不完善的地方体现在于当数据表中的字段 ...

  9. LeetCode 145 ——二叉树的后序遍历

    1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 递归得到 ...

  10. LeetCode 144 ——二叉树的前序遍历

    1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 将当前节点的数值加入到 data 中 递归得到其左子树的数据向量 temp,将 te ...