容斥定理
2015-09-07 23:04
316 查看
Mark
神奇的TLE,把一个强转去掉就600+Ms过了….
神奇的TLE,把一个强转去掉就600+Ms过了….
//HDU 5072 直接容斥 莫比乌斯在后面 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> using namespace std; int n, a[100005], f[100005]; bool v[100005]; vector <int> q; int main() { //freopen("in.txt","r",stdin); int T; scanf("%d", &T); while(T--) { memset(f, 0, sizeof(f)); memset(v, false, sizeof(v)); scanf("%d", &n); int maxx=-1; for(int i = 0; i < n; ++i) { scanf("%d", a + i); v[a[i]] = true; maxx = max(maxx, a[i]); } for(int i = 2; i <= maxx; ++i) { for(int j = i; j <= maxx; j += i) if(v[j])f[i]++; } long long ans = 0LL; for(int i = 0; i < n; ++i) { //if(a[i] == 1)continue; int now = a[i]; q.clear(); for(int j = 2; j <= now / j; ++j) if(now % j == 0) { q.push_back(j); while(now % j == 0) { now /= j; } } if(now != 1)q.push_back(now); int len = (int)q.size(); int b = 1 << len, cnt, fac; long long r = 0LL; for(int j = 1; j < b; ++j) { fac = 1; cnt = 0; for(int k = 0; k < len; ++k) { if((1 << k)&j) { cnt++; fac *= q[k]; } } if(cnt & 1)r += f[fac]; else r -= f[fac]; } if(r)r--; ans += r * (n - 1 - r); } long long p = (long long)n * (n - 1) * (n - 2) / 6LL; p-= ans / 2LL; printf("%I64d\n",p); } return 0; }
相关文章推荐
- 项目制图的简单准备
- sublime的使用
- poj1984 带权并查集
- 【趟坑】公共引用的jar包 pom的配置方法
- Java记录 -23- equals方法和双等号解析
- Objective-C Runtime 运行时(二):成员变量与属性
- 为什么支持Oauth2.0 的邮箱更安全?
- 为什么支持Oauth2.0 的邮箱更安全?
- uva 11478 - Halum(BellmanFold)
- php中日期时间函数date()用法总结
- Python 读取csv的某列
- hdu 1058 humble number
- Ubuntu下 Redis安装
- UVA 11992 Fast Matrix Operations (降维)
- JQ之html,text,val
- objective-c ios webkit 本地存储local-storage
- Oracle同义词synonym用法小结
- Cocos2dx引擎笔记——综述
- Hibernate(二)
- openCobol 安装 windows下cobol执行环境做成