【BZOJ 2154】Crash的数字表格
2016-04-24 17:07
113 查看
制杖了,,,求前缀和的时候$i×i$是int,然后当$i=10^7$时就喜闻乐见地爆int了,,,对拍之后查了一个下午的错才发现这个问题,,,最后枚举用的变量全都强行加上long long才A掉
不知道该说些什么了......
#include<cstdio> #include<cstring> #include<algorithm> #define read(x) x=getint() using namespace std; typedef long long LL; const int p = 20101009; const int N = 1E7 + 3; int getint() { int k = 0, fh = 1; char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) if (c == '-') fh = -1; for(; c >= '0' && c <= '9'; c = getchar()) k = k * 10 + c - '0'; return k * fh; } bool np ; int prime , mu , s ; void shai(int n) { mu[1] = 1; s[1] = 1; int num = 0; for(int i = 2; i <= n; ++i) { if (!np[i]) { mu[i] = -1; prime[++num] = i; } for(int j = 1; j <= num; ++j) { int t = prime[j] * i; if (t > n) break; np[t] = 1; if (i % prime[j] == 0) {mu[t] = 0; break;} mu[t] = -mu[i]; } s[i] = (s[i - 1] + (1LL * i * i * mu[i]) % p) % p; } } LL sum(LL x, LL y) {return (((x * (x + 1) / 2) % p) * ((y * (y + 1) / 2) % p)) % p;} LL F(LL x, LL y) { LL re = 0; for(int i = 1, la = 1; i <= x; i = la + 1) { la = min(x / (x / i), y / (y / i)); re = (re + (s[la] - s[i - 1]) * sum(x / i, y / i) % p) % p; } return re; } int main() { int n, m; read(n); read(m); if (n > m) swap(n, m); shai(n); LL ret = 0; for(LL d = 1, la = 1; d <= n; d = la + 1) { la = min(n / (n / d), m / (m / d)); ret = (ret + (d + la) * (la - d + 1) / 2 % p * F(n / d, m / d) % p) % p; } printf("%lld", (ret + p) % p); return 0; }
不知道该说些什么了......
相关文章推荐
- Linux内核分析 期中总结
- 今天早上9:30到外面吃了一碗12元的肉丝面条
- 20145304 实验三实验报告
- boost::thread
- Java中equals和==的区别
- Java NIO系列教程(7):FileChannel
- 多目标优化
- Android开发性能优化总结(二)
- MVC中Section、Partial View 和 Child Action(基本用法)
- 各种排序算法代码(C语言版)
- shell之别名和函数
- Java NIO 系列教程(6):Selector
- [剑指offer]二进制中1的个数
- 第 20 章 项目实战--首页内容介绍[上][3]
- php中实现的一个curl批处理的实例
- bzoj4538 [Hnoi2016]网络
- AmazeUI 模态框封装
- 正则的使用3
- 【Winform】.cs文件命名空间排序及注释批量处理工具
- Java NIO系列教程(5):通道之间的数据传输