一道我想骂人的题,差点把我气炸了。

题意:

求一个数的集合中(非多重集,每个数只出现一次)所有子集的gcd的和。结果MOD10^8+7输出。

输入输出不说了,自己看吧,不想写了。

当时我真把它当作数论题来写了,以为可以推导出什么公式然后化简大量重复的操作的。结果最后也没找到。最后题解说是dp,我同学说是暴力,吐血10升。

然后弄出来dp方程之后还是反复的wa,方程明明没啥问题,愣是卡了2个小时找不出错误,心情烦躁的要命,坑爹的室友还各种看视频打游戏,还不带耳机,我自己只好带着耳机大声放音乐,最后连音乐都听不下去了,恶心的想吐。

后来实在无奈了查了下题解,但是没人用dp写,有个用莫比乌斯反演的orz,还有个用暴力的,不过其实有dp的思想在里面。当然这不重要,重要的是我看见了他MOD加的位置挺有意思的,然后猛然想到我的int爆了!因为需要一个小于10^8的数×一个小于1000的数,这个数有可能爆!我叉!特么这不是故意卡int的意思吗?最后把这个改了终于过了……此时距离比赛结束已经5个小时了,我*!

状态转移方程:

dp[i][a[i]] += 1;

dp[i][j] += dp[i-1][j];

dp[i][gcd[j][a[i]]] += dp[i-1][j];

其中gcd[][]是预处理离线出来的,要不然可能会超时。

状态dp[i][j]表示在前n个数的集合中,gcd为j的集合有多少个。

方程表示三种情况:

  1. 只有a[i]的集合。
  2. 不存在a[i],只存在前i-1个数中若干数的集合。
  3. 存在a[i],且存在前i-1个数中若干数的集合。

时间复杂度为O(n*maxn),其中maxn为a[]数组中的最大值。

具体见代码——

 #include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long const int N = ;
const int Mod = ; int a[N];
LL dp[N][N];
int gcd[N][N];
int t, n; int Gcd(int x, int y)
{
if(x < y)
{
int t = x;
x = y;
y = t;
}
while(y != )
{
int t = y;
y = x%y;
x = t;
}
return x;
} void Table()
{
for(int i = ; i < ; i++)
{
for(int j = ; j <= i; j++)
{
gcd[i][j] = gcd[j][i] = Gcd(i, j);
}
}
} int main()
{
//freopen("test.in", "r", stdin);
Table();
scanf("%d", &t);
for(int tm = ; tm <= t; tm++)
{
scanf("%d", &n);
int maxn = ;
for(int i = ; i < n; i++)
{
scanf("%d", &a[i]);
maxn = maxn > a[i] ? maxn : a[i];
}
memset(dp, , sizeof(dp));
dp[][a[]] = ;
for(int i = ; i < n; i++)
{
dp[i][a[i]] += ; //转移方程1
for(int j = ; j <= maxn; j++)
{
dp[i][j] += dp[i-][j]; //转移方程2
dp[i][gcd[j][a[i]]] += dp[i-][j]; //转移方程3
dp[i][j] %= Mod;
dp[i][gcd[j][a[i]]] %= Mod;
}
}
int ans = ;
for(int i = ; i <= maxn; i++)
{
ans += (dp[n-][i]*i)%Mod; //这里小心dp如果是int可能会爆
ans %= Mod;
} printf("%d\n", ans);
}
return ;
}

自己确实挺弱的,还需要努力,但是今天确实非常烦!所有认为这些没什么好烦的,都是因为他没有身临其境的感觉。

最新文章

  1. maven css/js 压缩配置
  2. SQL SERVER 查看所有index
  3. mysql中char,varchar与text类型的区别和选用
  4. 低功耗蓝牙4.0BLE编程-nrf51822开发(9)
  5. asp.net for itextsharp 操作pdf
  6. linux下安装mysql5.6(官方文档)
  7. HDU 4268 Alice and Bob set用法
  8. 规范 : jobbox 中英文
  9. C#传递委托给C或C++库报错__对XXX类型的已垃圾回收委托进行了回调
  10. 基于FPGA的VGA显示静态图片
  11. HTML 练习实现鼠标移到用户图像展示更多信息
  12. Hibernate入门(九)级联删除
  13. HTML自学笔记
  14. undefined的几种情况
  15. CDMA码片序列问题
  16. Android自动化测试探索
  17. const 全面理解
  18. 6.关键字static
  19. 距离LCA离线算法Tarjan + dfs + 并查集
  20. SqlServer共用表达式(CTE)With As

热门文章

  1. 把iPad上的视频推送到大麦盒子去
  2. C语言复习---获取最大公约数(辗转相除法和更相减损法)
  3. 【DS】排序算法之希尔排序(Shell Sort)
  4. 在C#中使用.NET SDK创建控制
  5. java Runnable、Callable、FutureTask 和线程池
  6. mysql开启远程连接及本地连接
  7. HDU 4506 小明系列故事——师兄帮帮忙(二分快速幂)
  8. 第9月第26天 pairs和ipairs cocos2dx 动画
  9. MYSQL导入数据出现The MySQL server is running with the --secure-file-priv
  10. JS异常简单处理