第一题没话说 智商欠费 加老柴辅导终于过了

需要在意的是数据范围为2的63次方-1 三个数相加肯定爆了

四边形的定义  任意边小于其余三边之和

换句话说就是  最长边小于其余三边之和

这样的话问题转化为 最长边依次减其余三边的结果是否小于等于0

还有一点是题目出现0边 即最小边不为0 想得太多反而把0也算为合法。。。。

问题只需要 sort一下 判断a[0]==0||a[3]-a[2]-a[1]-a[0]>=0 输出NO //存在0边且最大边大于其他边之和

第二题 好多种姿势 题目链接http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=683&pid=1002

官方题解

  我们令dp[i][j]表示在前i个数中,选出若干个数使得它们的gcd为j的方案数,于是只需要枚举第i+1个数是否被选中来转移就可以了

令第i+1个数为v,当考虑dp[i][j]的时候,我们令$dp[i+1][j] += dp[i]j,dp[i+1][gcd(j,v)] += dp[i]j

复杂度O(N*MaxV) MaxV 为出现过的数的最大值

其实有O(MaxV *log(MaxV))的做法,我们考虑记f[i]表示从这些数中选择若干个数,使得他们的gcd是i的倍数的方案数。假如有K个数是i的倍数,则 f[i]=2^K-1,再用g[i]表示从这些数中选择若干个数,使得他们的gcd是i的方案数,则g[i]=f[i] - g[j] (对于所有j是i的倍数)。

由调和级数可以得到复杂度为O(MaxV *log(MaxV))

DP之二维数组转移

  我们把dp[i][j]作为考虑了第i个数GCD为j的方案数

直接gcd会超时 所以我们打个表GCD

  那么dp[i][j]+=dp[i-1][j]; dp[i][GCD[j][v[i]]]+=dp[i-1][j]; 然后就可以转移辣;

#include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<cstdlib>
#include<climits>
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+;
const int64 Mod=;
const double eps=1e-;
const int N=;
const int MAXN=;
typedef int rl;
inline void r(rl&num){
num=;rl f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
int gcd(int a,int b)
{
return b==?a:gcd(b,a%b);
}
int v[N];
int GCD[N][N];
int64 dp[N][N];
int main()
{
for(int i=;i<;i++)
{
for(int j=;j<=i;j++)
{
GCD[i][j]=GCD[j][i]=gcd(i,j);
}
}
int ci;
r(ci);
while(ci--)
{
int n;
r(n);
int mx=-;
for(int i=;i<=n;i++)
{
r(v[i]);
mx=max(mx,v[i]);
dp[i][v[i]]=;
}
for(int i=;i<=n;i++)
{
for(int j=;j<=mx;j++)
{
dp[i][j]+=dp[i-][j];
dp[i][j]%=Mod;
dp[i][GCD[j][v[i]]]+=dp[i-][j];
dp[i][GCD[j][v[i]]]%=Mod;
}
}
int64 ans=; for(int i=;i<=mx;i++)
{ ans+=(dp[n][i]*i)%Mod;
ans%=Mod;
}
memset(dp,,sizeof(dp));
memset(v,,sizeof(v));
printf("%I64d\n",ans);
}
return ;
}

二维

仔细想了一下 觉得可以优化为滚动数组 试了好久不对 最后瞎蒙

每个数都多考虑了一次 所以/2需要乘逆元 正好1e8+7是素数

Mod为素数,那么还可以根据费马小定理得到逆元为 2的(Mod-2)次方%Mod

  即除2等于乘2的(Mod-2)次方%Mod

所以加了一个快速幂 但是优化为滚动数组后 时间增加了一丢丢 但空间大幅度减少

16757862 2016-04-03 12:45:34 Accepted 5656 2511MS 5504K 1925 B G++ zxMrlc
16755798 2016-04-03 00:36:10 Accepted 5656 2449MS 13404K 1722 B G++ zxMrlc

但是姿势老感觉有问题 等wtw学长指点后我再改改 还有官方的第二个姿势还没有学会。。。衰

#include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<cstdlib>
#include<climits>
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+;
const int64 Mod=;
const double eps=1e-;
const int N=;
const int MAXN=;
typedef int rl;
inline void r(rl&num){
num=;rl f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
int gcd(int a,int b)
{
return b==?a:gcd(b,a%b);
}
int v[N];
int GCD[N][N];
int64 dp[N];
int main()
{
int64 xx=Mod-;
int64 an=,t=;
while(xx>)
{
if(xx&) an*=t;
xx/=;
an%=Mod;
t*=t;
t%=Mod;
}
for(int i=;i<;i++)
{
for(int j=;j<=i;j++)
{
GCD[i][j]=GCD[j][i]=gcd(i,j);
}
} int ci;
r(ci);
while(ci--)
{
int n;
r(n);
int mx=-;
for(int i=;i<=n;i++)
{
r(v[i]);
mx=max(mx,v[i]);
} for(int i=;i<=n;i++)
{
dp[v[i]]++;
for(int j=;j<=mx;j++)
{
// dp[i][j]+=dp[i-1][j];
dp[j]%=Mod;
dp[GCD[j][v[i]]]+=dp[j];
dp[GCD[j][v[i]]]%=Mod;
}
}
int64 ans=;
//for(int i=1;i<=mx;i++) cout<<dp[i]<<endl;
for(int i=;i<=mx;i++)
{ ans+=(dp[i]*i)%Mod;
ans%=Mod;
}
memset(dp,,sizeof(dp));
memset(v,,sizeof(v));
printf("%I64d\n",ans*an%Mod);
}
return ;
}

滚动数组

我们每次加入的数据会导致翻倍 所以刚才改为加完/2;

因为添加的v[i]导致的影响就是 当前位置dp[v[i]]多1 即方案数多了选自己的 所以在循环结尾-1就ok了 。。。根本不需要模除 但时间特么变大了

还是有点模糊的 不太清楚到底怎么回事。

16758163 2016-04-03 13:17:49 Accepted 5656 2636MS 5504K 1730 B G++ zxMrlc
#include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<cstdlib>
#include<climits>
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+;
const int64 Mod=;
const double eps=1e-;
const int N=;
const int MAXN=;
typedef int rl;
inline void r(rl&num){
num=;rl f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
int gcd(int a,int b)
{
return b==?a:gcd(b,a%b);
}
int v[N];
int GCD[N][N];
int64 dp[N];
int main()
{
for(int i=;i<;i++)
{
for(int j=;j<=i;j++)
{
GCD[i][j]=GCD[j][i]=gcd(i,j);
}
} int ci;
r(ci);
while(ci--)
{
int n;
r(n);
int mx=-;
for(int i=;i<=n;i++)
{
r(v[i]);
mx=max(mx,v[i]);
} for(int i=;i<=n;i++)
{
dp[v[i]]++;
for(int j=;j<=mx;j++)
{
// dp[i][j]+=dp[i-1][j];
dp[j]%=Mod;
dp[GCD[j][v[i]]]+=dp[j];
dp[GCD[j][v[i]]]%=Mod;
}
dp[v[i]]--;
}
int64 ans=;
for(int i=;i<=mx;i++)
{ ans+=(dp[i]*i)%Mod;
ans%=Mod;
}
memset(dp,,sizeof(dp));
memset(v,,sizeof(v));
printf("%I64d\n",ans%Mod);
}
return ;
}

滚动第二次优化

最新文章

  1. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
  2. docker 初探
  3. MSSQL 和 REDIS的数据类型对应关系
  4. sqlserver 字符串最后一次的位置,截取字符串
  5. Android Studio SDK 更新方法
  6. UVALive 6088 Approximate Sorting 构造题
  7. iOS FMDB中的使用
  8. (HYSBZ)BZOJ 1588 营业额统计
  9. BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )
  10. Cocos2d-X研究之v3.x瓦片地图具体解释
  11. Python之socketserver模块和验证客户端链接的合法性
  12. JS刷新当前页面的几种方法总结
  13. 使用kubectl创建部署
  14. 浮动闭合最佳方案:clearfix
  15. 阿里云被挖矿使用,导致cpu长期处于100%,ddgs进程,xWx3T进程,关于redis密码
  16. How to Pronounce the Word SOMETHING
  17. Docker部署大型互联网电商平台
  18. apt 命令大全
  19. Gradle Goodness: Task Output Annotations Create Directory Automatically
  20. javaIO--字符流

热门文章

  1. Flutter实战视频-移动电商-08.Dio基础_伪造请求头获取数据
  2. JAVA基础--JAVA API常见对象(包装类和正则)12
  3. Linux环境下Nginx及负载均衡
  4. Codeforces691A【读题-水】
  5. 【OpenJ_Bailian - 4110】圣诞老人的礼物-Santa Clau’s Gifts (贪心)
  6. Tomcat 连接池调优
  7. VRTK3.3.0-004传送
  8. css-原理详解
  9. zabbix图表中文乱码
  10. c# 参数传递问题(形参与实参)