2017西安交大ACM小学期数论 [等差数列]
2017-07-05 11:01
375 查看
等差数列
发布时间: 2017年6月25日 13:42 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M描述
给定正整数n,试问存在多少个和为n的等差数列?
当然,等差数列中每一项要为非负整数,且不考虑降序的等差数列。
输入
多组输入数据(不超过1000组)。
每组数据一个正整数n,1≤n≤109。
输出
每组数据输出一个数表示答案。
样例输入1
4 5
样例输出1
5 5
提示
对于第一组数据:
4=4
0+4=4
1+3=4
2+2=4
1+1+1+1=4
共存在5个等差数列
题解:这道题目是真的麻烦,公式推导特别多
代码:
#include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <map> typedef long long LL; using namespace std; const int MAX = 1e6; map<int,int> vis; using namespace std; LL n; int dfs(int k){ if(vis[k] || k > n){ return 0; } vis[k] = 1; if(k == 1){ return 1; } if(k == 2){ return 0; } LL t = 2*n/k; LL r = t / (k-1); if(t % 2 == 0){ if(k%2){ return r + 1; } else{ return r/2 + 1; } } else{ if(k%2){ return 0; } else{ return (r+1)/2; } } } int main(){ while(~scanf("%lld",&n)){ vis.clear(); if(n == 1){ puts("2"); continue; } if(n == 2){ puts("3"); continue; } LL s = sqrt(2*n); LL ans = 0; for(LL i = 1;i <= s;i++){ if(2*n%i == 0){ ans += dfs(i); if(i*i != 2*n) ans += dfs(2*n/i); } } ans += n/2+1; printf("%lld\n",ans); } return 0; }
相关文章推荐
- 2017西安交大ACM小学期数论 [阅兵式]
- 2017西安交大ACM小学期数论 [水题]
- 2017西安交大ACM小学期数论 [完全平方数]
- 2017西安交大ACM小学期数论 [更新学号]
- 2017西安交大ACM小学期数据结构 [分块,区间修改,单点查询]
- 2017西安交大ACM小学期数据结构 [分块、二维矩阵]
- 2017西安交大ACM小学期 神器插座 KMP匹配
- 2017西安交大ACM小学期数据结构 [线段树]
- 2017西安交大ACM小学期 文本查找[AC自动机]
- 2017西安交大ACM小学期数据结构 [树状数组]
- 2017西安交大ACM小学期数据结构 [树状数组,极大值]
- 2017西安交大ACM小学期 有趣异或[Trie树]
- 2017西安交大ACM小学期数据结构 [树状数组 离散化]
- 2017西安交大ACM小学期数据结构 [又是树状数组、异或]
- 2017西安交大ACM小学期 刁钻的顾客[3进制+折半枚举]
- 2017西安交大ACM小学期 美妙音乐[差分KMP匹配]
- 2017西安交大ACM小学期 毁灭序列[倒跑并查集]
- 2017西安交大ACM小学期 敏感词汇[AC自动机]
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F Trig Function(数论,组合数)
- 2017 ACM山东省赛 D - HEX 组合数学-数论