HDU 5139数据离线处理

此题可以找到规律f(n) = 1! * 2! *...*n!, 如果直接打表的话,由于n比较大(10000000),所以会超内存,这时候就要用到离线处理数据,就是先把数据存起来,到最后在暴力一遍求解就行了,代码如下

代码一(超内存):

 1 #include <stdio.h>
 2
 3 const long long mod = 1000000007;
 4 const int N = 10000007;
 5 long long a[N];
 6
 7 int main()
 8 {
 9     a[0] = a[1] = 1;
10     for (int i = 2; i < N; i++)
11     {
12         a[i] = a[i - 1] * i % mod;
13     }
14
15     for (int i = 2; i < N; i++)
16     {
17         a[i] = a[i - 1] * a[i] % mod;
18     }
19     int n;
20     while (~scanf("%d", &n))
21     {
22         printf("%I64d\n", a[n]);
23     }
24     return 0;
25 } 

代码二(AC)

 1 #include <stdio.h>
 2 #include <vector>
 3 #include <map>
 4 const long long mod = 1000000007;
 5 using namespace std;
 6
 7 int main()
 8 {
 9     int n;
10     vector<int> a;
11     map<int, long long> vis;
12     while (scanf("%d", &n) != EOF)
13     {
14         a.push_back(n);
15         vis[n] = -1;
16     }
17     long long prep = 1, nowp, prea = 1, nowa;
18     for (int i = 1; i <= 10000000; i++)//离线算法
19     {
20         nowp = prep * i % mod;//相当于求阶乘
21         prep = nowp;
22         nowa = nowp * prea % mod;//求n个阶乘的乘积
23         prea = nowa;
24         if (vis.count(i))
25         {
26             vis[i] = nowa;
27         }
28     }
29     for (int i = 0; i < a.size(); i++)//暴力一遍
30     {
31
32         printf("%I64d\n", vis[a[i]]);
33     }
34     return 0;
35 }

离线算法确实挺神奇的,要深刻理解才能做题

时间: 2024-10-24 19:21:16

HDU 5139数据离线处理的相关文章

HDU 5139 Formula --离线处理

题意就不说了,求公式. 解法: 稍加推导能够得出 : f(n) = n! * f(n-1) , 即其实是求: ∏(n!)  ,盲目地存下来是不行的,这时候看见条件: 数据组数 <= 100000, 那么我们可以离线做,先把他们存下来,然后再从小到大扫一边, 也就是最多10000000次乘法的复杂度.然后离线输出即可. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <

HDU5200 数据离线处理

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5200 ,数据离线处理. 这是BestCoder Round #36的C题,比赛时自己用线段树做,姿势不够优美,TLE了,后来才想到用离线处理的话很简单. 解法: 先把所有的树的高度和下标都存下来,然后按照高度进行排序:接下来把所有询问都先存下来,按照询问的高度进行排序.对于当前的查询h,在树中删除比h小的树木,假设删除的树的下标为p,则查看当前p+1和p-1位置的树木是否删去,如果两个位置都在,则+

hdu 2016 数据的交换输出

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2016 题目大意:把最小的和第一个交换并输出.注意格式哦! 1 #include <stdio.h> 2 int main () 3 { 4 int n,a[110],i,j,t,min; 5 while (scanf("%d",&n)!=EOF) 6 { 7 if (n==0) 8 break; 9 for (i=0; i<n; i++) 10 { 11 scan

HDU 2874 LCA离线算法

Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4477    Accepted Submission(s): 1284 Problem Description After World War X, a lot of cities have been seriously damage

大数据技术之_18_大数据离线平台_04_数据分析 + Hive 之 hourly 分析 + 常用 Maven 仓库地址

二十.数据分析20.1.统计表20.2.目标20.3.代码实现20.3.1.Mapper20.3.2.Reducer20.3.3.Runner20.3.4.测试二十一.Hive 之 hourly 分析21.1.目标21.2.目标解析21.3.创建 Mysql 结果表21.4.Hive 分析21.4.1.创建 Hive 外部表,关联 HBase 数据表21.4.2.创建临时表用于存放 pageview 和 launch 事件的数据(即存放过滤数据)21.4.3.提取 e_pv 和 e_l 事件数据

Spark进阶 大数据离线与实时项目实战 完整版

第1章 课程介绍&学习指南本章会对这门课程进行说明并进行学习方法介绍. 第2章 Redis入门Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度.本章将从Redis特性.应用场景出发,到Redis的基础命令,再到Redis的常用数据类型实操,最后通过Java API来操作Redis,为后续实时处理项目打下坚实的基础... 第3章 HBase入门HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:

hdu 5139 Formula (找规律+离线处理)

Formula Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 206    Accepted Submission(s): 83 Problem Description f(n)=(∏i=1nin−i+1)%1000000007You are expected to write a program to calculate f(n) w

hdu 5139 (离线处理)

题意: f(n)=(∏i=1nin?i+1)%1000000007 You are expected to write a program to calculate f(n) when a certain n is given. 思路: 写出前几项,就很容易得出递推式.但是因为n的数据范围是1~10000000,而内存给的小 ,所以并不能直接打表(MLE) 采用离线处理--先读完,再一次性输出. 中间采取了一点小技巧,先把所有读入的输入按照n的大小排序,使得处理答案时的时间复杂度为线性的,不然会

hdu 5139 Formula(离线处理)

Formula Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1200    Accepted Submission(s): 415 Problem Description You are expected to write a program to calculate f(n) when a certain n is given.