第一题:

LGTB 得到了一个序列,他想在这个序列中选择一个最长的连续子序列,使得这个子序列的最大公约数等于1。请告诉他他能得到的最大长度,如果没有这样的序列,输出-1.

对于50% 的数据,1 <=n <= 1000
对于100% 的数据,1 <=n <= 10^5 1 <= ai <= 10^9


解:首先,读题。。这个序列的公约数,是公共约数,所以,只要这个序列中有两个数的最大公约数为1,那么无论这个序列有多长,只要符合这个条件,那么它们所有的最大公约数,为1。所以答案为-1,或者,n。。。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100005
using namespace std;
int n,v[maxn],f[maxn],ans;
int gcd(int a,int b)
{
return b==?a:gcd(b,a%b);
}
int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%d",&v[i]);
for (int i=;i<=n;i++)
{
if (gcd(v[i],v[i-])==){
printf("%d",n);
return ;
}
}
if (n==&&v[n]==) printf("");
else printf("-1");
return ;
}

第二题:

LGTB 新买了一张n * m 的矩(桌) 阵(子),他想给某些1 * 1 的小矩形染色,使得染色之后,原矩阵的每个n * n 的子矩阵中都包含恰好k 个被染色了的小矩形。他想知道有多少种染色方案能让他满足上述要求。因为答案可能很大,请输出方案数模1000000007 (10^9 + 7) 后的值.

对于15% 的数据,1 <=n *m <= 20, n <= m
对于40% 的数据,1 <=n <= 10, n <= m <= 1000
对于100% 的数据,1 <= n <= 100, n <= m <= 10^18, 0 <= k<= n^2


解:  这道题,考试的时候没怎么仔细想。因为不知道为什么考试的时候根本没有心情思考,一直很浮躁,不在状态。

   首先,要先找到:对于每n列中的第 i 列中的被染色数等于第n+i 列的染色数。以下为证明:

 i (1,2,3,......)对应当前列有第 i 个矩阵经过  n=4,m=9
1,2 1,2,3 1,2,3,4 2,3,4,5 3,4,5,6 4,5,6 5,6

每列的染色数

a

b c d a b c d a

    注意到,红色部分,都是染色为a,因为1矩阵染了a,那2,3,4,5矩阵也该染a个,6矩阵也该染a个,才满足所有矩阵染的数相等。

    所以我们可以直接只算n列为一块,就可以了。但是最后一块不一定为n列。

    那么用dp[i][j]表示n列中的第 i 列染 j 个的方案数。dp[i][j]=∑(dp[i-1][j-p]*C(n,p)^T[i])%P。T[i]表示 i 这一列(在n列中的位置)在m中重复了几次。如红色部分所在列,重复了3次,而剩下部分所在列只重复了2次,也就是“最后一块不一定为n列”的解释。对于所有第 i 列而言,j<=i*n&&j<=k,染 p (p=min(n,j)) 个有C(n,p)中组合,有T[i]个第 i 列,所以方案数相乘(乘法原理:这是T[i]列同时满足),而对于所有的p,是加法∑,(加法原理:有p中不同的填法并列)。

    注意 i, j,p都可以从0 开始。乘方用快速幂。

    还有T[i]不一定是一个数组,可以改为判断当前 i 列是否小于m%n,如果小于则T[i]=m/n+1,否则为m/n。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 105
#define ll long long
#define P 1000000007//打错了mod数
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
using namespace std;
ll n,m,k;
ll dp[maxn][maxn*maxn],c[][maxn][maxn];//组合--i 中取 j -- 0: m/n,1:m/n+1
ll ksm(ll cur,ll ki)
{
ll t=,tmp=cur,kk=ki;
while (kk)
{
if (kk%) t=(t*tmp)%P;
kk>>=;
tmp=(tmp*tmp)%P;
}
return t;
}
void pre()
{
for (int i=;i<=;i++)
{
c[][i][]=c[][i][i]=c[][i][]=c[][i][i]=;
for(int j=;j<i;j++)
{
c[][i][j]=c[][i][j]=c[][i-][j-]+c[][i-][j];//***
c[][i][j]%=P;
}
}
ll xi=m/n;
for (int i=;i<=;i++)
for (int j=;j<=i;j++)//<=i
{
c[][i][j]=ksm(c[][i][j],xi);
c[][i][j]=ksm(c[][i][j],xi+);
}
}
int main()
{
freopen("table.in","r",stdin);
freopen("table.out","w",stdout);
scanf(AUTO AUTO AUTO,&n,&m,&k);
pre();
int cur=(<=m%n);// choose 0 or 1
for (int i=;i<=min(n,k);i++)//pre work ,from 0可以不选
dp[][i]=c[cur][n][i];
for (int i=;i<=n;i++)
{
int cu=(i<=m%n);// >=i choose 1
for (int j=;j<=i*n&&j<=k;j++)// from 0
for (int t=;t<=min(n,(ll)j);t++)//min(n,j) from 0
{
// dp[i][j]+=(dp[i-1][j-t]*c[cu][n][t])%P;
dp[i][j]=(dp[i][j]+(dp[i-][j-t]*c[cu][n][t])%P)%P;//注意加法原理和乘法原理
}
}
printf(AUTO,dp[n][k]);
return ;
}

第三题:

LGTB 最近迷上了正方形,现在他有n 个在二维平面上的点,请你告诉他在这些点中选4 个点能组成四条边都平行于坐标轴的正方形的方案数有多少

对于10% 的数据,1 <= n<= 50
对于30% 的数据,1 <=n <= 1000
对于100% 的数据,1 <=n <=10^5,0 <= xi, yi <= 10^5


解:

  这套题怎么两道都是相似的。。然后我就写了一个大暴力。判断每个点向它的左下方找长度依次为:1,2,3,..min(xi,yi)的满不满足正方形。居然还得了50。。意料之外。

50分代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1005
using namespace std;
int n,ans;
struct pp{
int x,y;
};
pp v[maxn*maxn];
bool mp[maxn][maxn];
int main()
{
freopen("square.in","r",stdin);
freopen("square.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
v[i].x=a;v[i].y=b;
mp[a][b]=true;
}
for (int i=;i<=n;i++)
{
int xi=v[i].x,yi=v[i].y;
if (xi==||yi==) continue;
int ma=min(xi,yi);
for (int j=;j<=ma;j++)
if (mp[xi-j][yi]&&mp[xi][yi-j]&&mp[xi-j][yi-j]){
ans++;
}
}
printf("%d",ans);
return ;
}

  还有两天。不准备写正解了,还不如我自己复习呢。

��--1-1-11

【67测试20161116】【数论】【DP】【思维】的更多相关文章

  1. 【bzoj1408】[Noi2002]Robot 数论+dp

    题目描述 输入 输出 样例输入 3 2 1 3 2 5 1 样例输出 8 6 75 题解 语文题+数论+dp 花了大段讲述什么叫mu,什么叫phi,只是新定义的mu将2看作有平方因子,新定义的phi( ...

  2. 洛谷$P5366\ [SNOI2017]$遗失的答案 数论+$dp$

    正解:数论$dp$ 解题报告: 传送门$QwQ$ 考虑先质因数分解.所以$G$就相当于所有系数取$min$,$L$就相当于所有系数取$max$ 这时候考虑,因为数据范围是$1e8$,$1e8$内最多有 ...

  3. cf1153D 树形dp+思维

    一千八的题也不会做了呜呜呜 size[u]表示结点u下的叶子结点, 思维:可以想到一个子树对其父亲会有一个消耗值 考虑一个点如果是max,那么其最大值可以是size[u]-p,p是消耗值最小的子树 一 ...

  4. 数论+DP HDOJ 4345 Permutation

    题目传送门 题意:一个置换群,经过最少k次置换后还原.问给一个N个元素,在所有的置换群里,有多少个不同的k. 分析:这道题可以转化成:N = Σ ai ,求LCM ( ai )有多少个不同的值.比如N ...

  5. E. The Contest ( 简单DP || 思维 + 贪心)

    传送门 题意: 有 n 个数 (1 ~ n) 分给了三个人 a, b, c: 其中 a 有 k1 个, b 有 k2 个, c 有 k3 个. 现在问最少需要多少操作,使得 a 中所有数 是 1 ~ ...

  6. 7月15日考试 题解(链表+状压DP+思维题)

    前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...

  7. 【61测试】【dp】【二分】【前缀和】【树剖】

    不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...

  8. HDU 5656 CA Loves GCD (数论DP)

    CA Loves GCD 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/B Description CA is a fine c ...

  9. Codeforces 264B 数论+DP

    题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...

随机推荐

  1. "rel=nofollow"属性

    nofollow是HTML元标签(meta)的content属性和链接标签(a)的rel属性的一个值,告诉机器(爬虫)无需追踪目标页,为了对抗blogspam(博客垃圾留言信息),Google推荐使用 ...

  2. 【iOS实现一个颜色渐变的弧形进度条】

    在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...

  3. kegg-kass注释--转载

    在注释KEGG的时候,一直用到kaas,具体kaas是个什么东东,简单的总结一下吧.     KEGG是由日本人搞的一个代谢图,收录基因和基因组的数据库,数据库可以分为 3大部分,基因数据库, 化学分 ...

  4. http协议 幂等性的理解

    HTTP GET.DELETE.PUT.POST四种主要方法的幂等性的理解 GET: GET请求是幂等的,多次的GET请求,不应该修改数据状态,只是查询. DELETE Delete请求也具有幂等性, ...

  5. Java 中如何原样输出转义符号

    Java 中的转义字符有好几种,常见的有: 八进制转义字符,格式:\ + 1到3位八进制数字,如\1, \20,范围为 \0 ~ \377,即最大值为255. Unicode转义字符,格式:\u + ...

  6. linux下安装mysql5.7.17及简单配置

    原文:http://www.th7.cn/db/mysql/201612/218745.shtml 1.mysql5.7.17安装在/usr/local/mysql目录里面,也可以安装在其他地方 (安 ...

  7. SQL Server Reporting Service(SSRS) 第三篇 SSRS Matrix用法

    以前不是太清楚SSRS的功能,自从最近有了了解之后,发现它的功能的确很强大.对于Matrix,刚开始我竟不知道它到底有什么用,现将通过一个例子中去理解Matrix,以及和分组Group结合使用的便利性 ...

  8. 【转】 linux内存管理

    一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得 ...

  9. SQL SERVER 分区

    “索引要与其基表对齐,并不需要与基表参与相同的命名分区函数.但是,索引和基表的分区函数在实质上必须相同,即: 1) 分区函数的参数具有相同的数据类型: 2) 分区函数定义了相同数目的分区: 3) 分区 ...

  10. 《Spark MLlib机器学习实践》内容简介、目录

      http://product.dangdang.com/23829918.html Spark作为新兴的.应用范围最为广泛的大数据处理开源框架引起了广泛的关注,它吸引了大量程序设计和开发人员进行相 ...