求助2015 Multi-University Training Contest 1_A(hdu 5288)
来源:互联网 发布:2016网络零售交易额 编辑:程序博客网 时间:2024/05/21 06:57
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5288
题解:题目意思是让你求所有不同区间中对于i不是因子的个数,不懂可以手动测试案例试一下。按照一般想法一定会超时的,我们换个思路,求对于每个值,有多少区间可以达到没有其因子。对于此,我们可以查找左边最远能到达的不是因子的值x,和右边最远能到达的不是因子的值y,其值为x*y+x+y+1(或者为(x+1) * (y+1))。
贴上ac代码:
#include <bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef long long LL;const double PI = acos(-1.0);const int mod = 1e9+7;const int N = 100100;int n,m;int a[N];int l[N];int r[N];int mark[N];int main(){ while(~scanf("%d",&n)) { memset(mark,0,sizeof(mark)); memset(r,0,sizeof(r)); memset(l,0,sizeof(l)); LL ans = 0; for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); r[i] = n+1; for(int j = a[i]; j < 10010; j += a[i]) { if(mark[j]) { r[mark[j]] = i; mark[j] = 0; } } mark[a[i]] = i; } memset(mark,0,sizeof(mark)); for(int i = n; i >= 1; i--) { for(int j = a[i]; j < 10010; j += a[i]) { if(mark[j]) { l[mark[j]] = i; mark[j] = 0; } } mark[a[i]] = i; } for(int i = 1; i <= n; i++) { ans = (ans + (LL)(i - r[i])*(LL)(l[i] - i)%mod)%mod; } printf("%I64d\n",ans); } return 0;}
此代码是条理清晰,我根据他人代码打的,比起我的代码好多了。
若朋友有时间,来帮我看看我的代码,虽然麻烦点,但思路正确,不知道为什么wa了。感谢!!!
#include <bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef long long LL;const double PI = acos(-1.0);const int mod = 1e9+7;const int N = 100100;int n,m;int a[N];int re1[N];int da[N];int re2[N];int mark[N];int main(){ while(~scanf("%d",&n)) { memset(mark,0,sizeof(mark)); LL ans = 0; for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); re1[a[i]] = i; re2[a[i]] = i; da[a[i]] = i; } for(int i = 1; i <= n; i++) { for(int j = a[i]; j < 10010; j += a[i]) { if(da[j] > i) re1[j] = i; if(re2[j] < i && !mark[j]) { re2[j] = i; mark[j] = 1; } } } for(int i = 1; i <= n; i++) { int zou; if(re1[a[i]] == i) zou = i-1; else zou = i-re1[a[i]]-1; //cout << "左 : " << zou << endl; int you; if(re2[a[i]] == i) you = n-i; else you = re2[a[i]]-i-1; //cout << "右 : " << you << endl; ans = (ans + (LL)(zou+1)*(LL)(you+1)%mod)%mod; } printf("%I64d\n",ans%mod); } return 0;}
0 0
- 求助2015 Multi-University Training Contest 1_A(hdu 5288)
- hdu 5294 Tricks Device 2015 Multi-University Training Contest 1
- hdu 5289 Assignment 2015 Multi-University Training Contest 1
- 2015 Multi-University Training Contest 1 Hdu 5289 Assignment
- 2015 Multi-University Training Contest 1 Hdu 5292 Pocket Cube
- 2015 Multi-University Training Contest 1 Hdu 5297 Y sequence
- HDU 5289 Assignment (2015 Multi-University Training Contest 1)
- hdu 5291 Candy Distribution 2015 Multi-University Training Contest 1
- hdu 5289 Assignment(2015 Multi-University Training Contest 1)
- hdu 5291 Assignment 2015 Multi-University Training Contest 1
- hdu 5291 Candy Distribution 2015 Multi-University Training Contest 1
- hdu 5289 Assignment 2015 Multi-University Training Contest 1
- hdu 5299 Circles Game 2015 Multi-University Training Contest 1
- HDU 5289 Assignment(2015 Multi-University Training Contest 1)
- 2015 Multi-University Training Contest 1(hdu 5288 - hdu 5299)
- 2015 Multi-University Training Contest 1
- 2015 Multi-University Training Contest 1记录
- 2015 Multi-University Training Contest 1
- STM32经验心得(一)
- Java 线程池框架核心代码分析
- 安卓模拟器运行慢解决办法
- 分布式消息队列(2)
- 意外险知识总结
- 求助2015 Multi-University Training Contest 1_A(hdu 5288)
- python文件结构
- AsyncTask
- 网络流。。
- java tcp网络编程、jdbc、流的关闭(close()封装)
- uva10288 Coupons
- 《Java源码分析》:Hashtable
- cv::Mat和std::vector的相互转化
- Ubuntu16.04上搭建Hadoop2.7.2的单机模式和伪分布式模式