HDU 5139 Formula 卡内存

题目就是求这个

n达到10^7,测试数据组数为10^5

为了防止TLE,一开始把每个n对应的值先求出来,但发现竟然开不了10^7的数组(MLE),然后就意识到这是第一道卡内存的题目。。。

只能离线做,把每个n从小到大排序,然后从小到大依次求,然后把结果存下来,最后排回去输出。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<sstream>
#define eps 1e-9
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 100005
#define MAXM 10000005
#define INF 0x3fffffff
#define MOD 1000000007
using namespace std;
typedef long long LL;
struct node
{
	int num,i,ans;
};
int i,n,size,maxn,p;
node G[MAXN];
bool flag;
bool cmp(node x,node y)
{
	return x.num<y.num;
}
bool cmp2(node x,node y)
{
	return x.i<y.i;
}
int main()
{
	while (~scanf("%d",&n))
	{
		G[size].num=n;
		G[size].i=size;
		size++;
	}
	sort(G,G+size,cmp);
	LL mul=1;
	LL last=0;
	LL d=1;
	for (p=0;p<size;p++)
	{
		for (i=last+1;i<=G[p].num;i++)
		{
			mul=(mul*i)%MOD;
			d=(d*mul)%MOD;
		}
		G[p].ans=d;
		last=G[p].num;
	}
	sort(G,G+size,cmp2);
	for (i=0;i<size;i++)
	{
		printf("%d\n",G[i].ans);
	}
	return 0;
}

  

时间: 2024-12-13 08:59:23

HDU 5139 Formula 卡内存的相关文章

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.

hdu 5139 Formula

http://acm.hdu.edu.cn/showproblem.php?pid=5139 思路:这道题要先找规律,f(n)=n!*(n-1)!*(n-2)!.....1!;  不能直接打表,而是离线处理,一次性处理出来. 1 #include <cstdio> 2 #include <cstring> 3 #include <map> 4 #include <algorithm> 5 #define ll long long 6 #define mod

hdu 5139 Formula(BestCoder Round #21)

Formula                                                             Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 306    Accepted Submission(s): 128 Problem Description f(n)=(∏i=1nin?i+1)%100

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 Formula --离线处理

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

HDU 5057 Argestes and Sequence --树状数组(卡内存)

题意:给n个数字,每次两种操作: 1.修改第x个数字为y. 2.查询[L,R]区间内第D位为P的数有多少个. 解法:这题当时被卡内存了,后来看了下别人代码发现可以用unsigned short神奇卡过,于是学习了. 这种区间求和的问题很容易想到树状数组,根据第i位为j(i<10,j<10)建立100棵树状数组(由于内存100*100000被卡,且看到个数,即c[10][10][100000]的值最多为100000,那么最多分两个unsigned short (0~65535),记录一下就可以了

hdu 2546 饭卡

0-1背包问题 i = 1,扫所有上限价钱只购买一件物品的最大消费(price[1]) i = 2,更新一遍,此时是购买两件物品的最大消费(price[2]) 以此类推~有n件物品 但是只进行到n-1,是因为最大的那件物品留至最后才减 价值最高上限为m-5 1 #include<iostream> 2 #include<memory.h> 3 #include<algorithm> 4 using namespace std; 5 int price[1010]; 6

hdu 2546 饭卡(0-1背包)

题目来源:hdu 2546 饭卡 饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16645 Accepted Submission(s): 5797 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后

HDU 2546 饭卡 01背包问题

01背包问题,增加一个额外条件,余额大于等于5的时候,可以购买任意价格的东西,那么就把5保留下来买最大价格的物品. 然后转化为收益的时候要注意初始条件,即没买东西的时候收益就是余额,就是所有的钱.这个还是有点难转换思维的. 最后是要熟悉背包填表,不需要保留选择的时候,就逆向填表,只需要一维表就可以了,当然也可以使用滚动数组,两个一维数组就可以了. 走了算法一圈回来了,AC自动机,线段树等都学会了,但是遇上这些基础DP还是不太轻松,看来需要继续打打基础.主要是思维转换不够流畅,速度就不快了. #i