ZOJ3558 How Many Sets III(公式题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud

How Many Sets III


Time Limit: 2 Seconds      Memory Limit: 65536 KB


Given a set S = {1, 2, ..., n}, your job is to count how many set T satisfies the following condition:

Input

There are multiple cases, each contains only one integer n ( 1 ≤ n ≤ 109 ) in one line, process to the end of file.

Output

For each case, output an integer in a single line: the total number of set T that meets the requirmentin the description above, for the answer may be too large, just output it mod 100000007.

Sample Input

2
3

Sample Output

1
4

看到这种输出只和一个数有关的,而且还是整数,想都不想,先暴力求出前几项,然后oeis大法,查到公式后

a(n) = sum { i=1..n-1, j=1..floor((n-1)/i) } (n - i*j)

发现这个公式只是n^2的,于是我们需要优化其中的步骤,首先,对于第二维,我们很容易搞掉,那么对于第一维,我们发现其中有一个(n-1)/i,那么其实有很多是对应的,于是我们只需要枚举1到sqrt(n-1)即可。即对于每一个i,在公差在(n-1)/(i+1) + 1到(n-1)/i这个范围内是可求的,另外注意求一下其相对的情况,看上去比较轻松,然而我这种数学渣还是推了半个多小时才推出来的

  1 /**
  2  * code generated by JHelper
  3  * More info: https://github.com/AlexeyDmitriev/JHelper
  4  * @author xyiyy @https://github.com/xyiyy
  5  */
  6
  7 #include <iostream>
  8 #include <fstream>
  9
 10 //#####################
 11 //Author:fraud
 12 //Blog: http://www.cnblogs.com/fraud/
 13 //#####################
 14 //#pragma comment(linker, "/STACK:102400000,102400000")
 15 #include <iostream>
 16 #include <sstream>
 17 #include <ios>
 18 #include <iomanip>
 19 #include <functional>
 20 #include <algorithm>
 21 #include <vector>
 22 #include <string>
 23 #include <list>
 24 #include <queue>
 25 #include <deque>
 26 #include <stack>
 27 #include <set>
 28 #include <map>
 29 #include <cstdio>
 30 #include <cstdlib>
 31 #include <cmath>
 32 #include <cstring>
 33 #include <climits>
 34 #include <cctype>
 35
 36 using namespace std;
 37 typedef long long ll;
 38
 39 //
 40 // Created by xyiyy on 2015/8/5.
 41 //
 42
 43 #ifndef ICPC_INV_HPP
 44 #define ICPC_INV_HPP
 45 typedef long long ll;
 46
 47 void extgcd(ll a, ll b, ll &d, ll &x, ll &y) {
 48     if (!b) {
 49         d = a;
 50         x = 1;
 51         y = 0;
 52     }
 53     else {
 54         extgcd(b, a % b, d, y, x);
 55         y -= x * (a / b);
 56     }
 57 }
 58
 59 ll inv(ll a, ll mod) {
 60     ll x, y, d;
 61     extgcd(a, mod, d, x, y);
 62     return d == 1 ? (x % mod + mod) % mod : -1;
 63 }
 64
 65
 66 #endif //ICPC_INV_HPP
 67
 68 const ll mod = 100000007;
 69
 70 class TaskJ {
 71 public:
 72     void solve(std::istream &in, std::ostream &out) {
 73         ll n;
 74         while (in >> n) {
 75             ll ans = 0;
 76             ll m = n - 1;
 77             ll num = inv(2, mod);
 78             for (ll i = 1; i * i <= m; i++) {
 79                 ll r = m / i;
 80                 ll l = m / (i + 1) + 1;
 81                 if (l > r)continue;
 82                 ans += (n * i % mod * (r - l + 1) % mod -
 83                         (1LL + i) * i % mod * num % mod * (l + r) % mod * (r - l + 1) % mod * num % mod) % mod + mod;
 84                 ans %= mod;
 85                 if (i != r)ans += (n * r % mod - i * r % mod * (1LL + r) % mod * num % mod) % mod + mod;
 86                 ans %= mod;
 87             }
 88             out << ans << endl;
 89         }
 90     }
 91 };
 92
 93 int main() {
 94     std::ios::sync_with_stdio(false);
 95     std::cin.tie(0);
 96     TaskJ solver;
 97     std::istream &in(std::cin);
 98     std::ostream &out(std::cout);
 99     solver.solve(in, out);
100     return 0;
101 }
时间: 2024-10-29 19:11:19

ZOJ3558 How Many Sets III(公式题)的相关文章

华东交通大学2018年ACM“双基”程序设计竞赛 C. 公式题 (2) (矩阵快速幂)

题目链接:公式题 (2) 比赛链接:华东交通大学2018年ACM"双基"程序设计竞赛 题目描述 令f(n)=2f(n-1)+3f(n-2)+n,f(1)=1,f(2)=2 令g(n)=g(n-1)+f(n)+n*n,g(1)=2 告诉你n,输出g(n)的结果,结果对1e9+7取模 输入描述: 多组输入,每行一个整数n(1<=n<=1e9),如果输入为0,停止程序. 输出描述: 在一行中输出对应g(n)的值,结果对1e9+7取模. 示例1 输入 1 5 9 456 0 输出

codeforces 340C Tourist Problem(公式题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Tourist Problem Iahub is a big fan of tourists. He wants to become a tourist himself, so he planned a trip. There are n destinations on a straight road that Iahub wants to visit. Iahub starts

2015杭电多校(III)改题表

题号 hdu 类型 比赛 分配 最终 1001 5316 线段树 YES    √ 1002 5317 简单题 YES    √ 1003 5318 快速幂 YES    √ 1004 5319 模拟 YES    √ 1005 5320 数论   Z   1006 5321 数论   Z   1007 5322 dp YES    √ 1008 5323 搜索 YES    √ 1009 5324 树套树 NO W  √ 1010 5325 bfs YES    √ 1011 5326 简单题

【BZOJ1426】收集邮票 概率DP 论文题 推公式题

链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46468557"); } 题解: 并没有什么卵用,首先有一个神思路.然后神推公式.以下这篇博客写得非常详尽..另外题意是买第 i 次花 i 元,不是标号为 i 的邮票花 i 元. <strong">

hdu 6217 A BBP Formula 公式题

https://zh.wikipedia.org/wiki/%E8%B4%9D%E5%88%A9-%E6%B3%A2%E5%B0%94%E6%B8%A9-%E6%99%AE%E5%8A%B3%E5%A4%AB%E5%85%AC%E5%BC%8F http://blog.csdn.net/meopass/article/details/78327614 这类公式是用来求解一些无理数常数的公式,特点是不需要求解前n-1位也能去算第n位 假设你得到了PI,那么你求十六进制下第n位,只需要把在16进制下

计蒜客 ACM-ICPC 2018 南京赛区网络预赛 A. An Olympian Math Problem-数学公式题

A. An Olympian Math Problem 54.28% 1000ms 65536K Alice, a student of grade 66, is thinking about an Olympian Math problem, but she feels so despair that she cries. And her classmate, Bob, has no idea about the problem. Thus he wants you to help him.

hdu 3054 Fibonacci 找循环节的公式题

Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Problem Description We know the Fibonacci Sequence F1=1,F2=1,F3=2,F4=3,F5=5, ... Fx = Fx-1+Fx-2 We want to know the Mth number which has K consecutive "0&qu

hdu_5874_Friends and Enemies(公式题)

题目链接:hdu_5874_Friends and Enemies 题意: 有nn个人, mm种颜色的石头, 人两两之间要么是朋友, 要么是敌人. 每个人可以携带若干种石头或者不带, 要求朋友之间至少携带一种颜色相同的石头, 敌人之间不能携带有相同颜色的石头. 问最坏情况下, mm种颜色是否够. 题解:(叉姐) Nero搞出了一个结论: nn个点的图, 要求有尽量多的边, 并且不存在三元环. 这个边数就是mm的下界. 对于一个nn个结点的没有三元环的图, 边数最大的就是完全二分图. 于是答案就是

codeforces 342C Cupboard and Balloons(公式题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud C. Cupboard and Balloons A girl named Xenia has a cupboard that looks like an arc from ahead. The arc is made of a semicircle with radius r (the cupboard's top) and two walls of height h (the