首页 > 其他分享 >TLE过数学节

TLE过数学节

时间:2024-03-17 15:59:46浏览次数:21  
标签:12 30001 int 300 19 数学 TLE 101

题目描述:

今天是察哈尔省的数学节,TLE打算过来与民同乐。其中有一道题:已知 n 个整数x1,x2,…,xn 以及一个整数kk<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4k3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。

现在,要求你计算出和为素数共有多少种。例如上例,只有一种的和为素数:3+7+19=29。

输入格式:

第一行共有2个自然数 nk
第二行是一个长度为n的序列 x1,x2,…,xn 。

输出格式:

输出共一行,为总方案数。由于该数可能很大,请输出在mod 1000000007下的值。

样例输入:
4 3
3 7 12 19

样例输出:
1
提示:

对于50%的数据:

n≤10k≤5

对于100%的数据:

1≤n≤1000≤xi≤3001≤k≤n

时间限制: 1000ms
空间限制: 128MB


代码模板:
#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
int a[101], b[30001], c[30001], f[101][30001], n,m, maxn,len=0;

int main(){
	ios :: sync_with_stdio( false );  //读入优化
	cin >> n >> m;
	for (int i=1; i<=n; i++) cin>>a[i], maxn+=a[i];
	
	for ( int i=2; i<= maxn ; i++){     //埃式筛法,先预处理出所有的质数
		if ( b[i] == 0 ){
			c[ ++len ] = i;
			for (int j=2; j*i <= maxn ; j++)
				b[ j*i ]=1;			
		}			
	}	
	f[0][0]=1;
	//Dp  O(100 * 100 *30000)
	for (int i=1; i<=n; i++){
		for (int k=min(i,m); k>=1; k--){//三维数组开不出来,开两维数组需要从后往前更新
			for (int j=a[i]; j <= maxn; j++){  //这一维可以不用从后更新
				f[k][j] = (        ) % MOD;
			}
		}
	}
	long long ans=0;
	for (int j=1; j <= len; j++){
		ans +=       ;
	}		
	cout  <<  ans % MOD;
	return 0;
}

本题是一个01背包问题。

n个数看作n件物品,背包的容量为300*n,f[i,k,j]表示,前i个物品,当前取k个过来,j容量能取到的方案数。

f[i] [k] [j]  =   (  f[i-1] [k] [j] +f[i-1][k-1] [ j-a[i] ] ) % 1000000007   ( j- a[i] > 0 )

背包时间效率是:O(300*n2),实现时只要二维就可以,不需要开三维的空间。

最后把300*n范围内的质数筛出,累加即为答案。

大家可以看模版理解一下,自己填空。


复 完整代码 :

#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
int a[101], b[30001],c[30001], f[101][30001], n,m, maxn,len=0;

int main(){
	ios :: sync_with_stdio( false );  //读入优化
	cin >> n >> m;
	for (int i=1; i<=n; i++) cin>>a[i], maxn+=a[i];
	
	for ( int i=2; i<= maxn ; i++){     //埃式筛法,先预处理出所有的质数
		if ( b[i] == 0 ){
			c[ ++len ] = i;
			for (int j=2; j*i <= maxn ; j++)
				b[ j*i ]=1;			
		}			
	}	

	f[0][0]=1;
	//Dp  O(100 * 100 *30000)
	for (int i=1; i<=n; i++){
		for (int k=min(i,m); k>=1; k--){//三维数组开不出来,开两维数组需要从后往前更新
			for (int j=a[i]; j <= maxn; j++){  //这一维可以不用从后更新
				f[k][j] = ( f[k][j]+f[k-1][j-a[i]] ) % MOD;
			}
		}
	}
	long long ans=0;
	for (int j=1; j <= len; j++){
		ans += f[m][c[j]];
	}		
	cout  <<  ans % MOD;
	return 0;
}

标签:12,30001,int,300,19,数学,TLE,101
From: https://blog.csdn.net/2301_76310851/article/details/136783156

相关文章

  • 【NC23046】华华教月月做数学
    题目华华教月月做数学考虑数据溢出的问题思路题目要求很简单,就是算aaa的bb......
  • 专题 | 二分&0/1分数规划&数学期望
    二分二分编号对于一个有单调性的数组,我们可以二分编号,如果a[mid]<ans,那么mid就往a[]更大的那边走while(r>l){mid=(l+r)/2;if(judge(mid))l=mid;elser=mid;}注意二分代码的写法细节和你的check函数有关!(其实是和你在对于恰好满足要求时check返回值有......
  • 线性代数学习笔记
    【定义】向量:每个向量由若干个标量(数)组成,每个标量都来自同一个域\(F\)。若一个向量包含\(k\)个标量,称其为\(k\)维向量。向量空间\(V\):由若干个向量组成。需要满足以下条件:\(V\)中的向量满足加法交换律和加法结合律。\(V\)中存在\(0\)向量,\(\vec{0}+\vec{u}=......
  • 数学卷积与卷积神经网络
    卷积神经网络之卷积数学的卷积公式定义为:从f(x)和g(x)函数中生成了一个新的函数,表示把g(x)进行翻转平移后与f(x)函数相乘的重叠部分进行积分。看起来复杂,都是纸老虎,其实g函数翻转平移之后与f的重叠部分大多都是零。在实际应用中用来处理信号,挺有用的,像是用来简化傅里叶变......
  • 维修Kistler奇石乐触摸屏监视器maXYmos 5867B1010 5867B0001
    用于批量生产和系列零件的光学测试和分选机光学检测系统为必须满足医疗技术或汽车行业等行业严格要求的产品提供了一种久经考验的质量保证方法。为了成功实施0-ppm策略并保证所有制造零件的质量,测试系统必须可靠地检查工件。检查不仅必须涵盖复杂的几何形状和尺寸稳定性,还必......
  • CF575H Bots 题解 组合数学
    Bots传送门SashaandIraaretwobestfriends.Buttheyaren’tjustfriends,theyaresoftwareengineersandexpertsinartificialintelligence.Theyaredevelopinganalgorithmfortwobotsplayingatwo-playergame.Thegameiscooperativeandturn......
  • 二维逆运动学 – 数学
    如果您已经关注此博客一段时间,您可能已经注意到一些反复出现的主题。逆向运动学绝对是其中之一,我已经专门写了一整套关于如何将其应用于机械臂和触手的系列文章。如果您还没有读过它们,请不要担心:这个新系列将是独立的,因为它从一个新的角度回顾了逆运动学的问题。您可以在此处阅......
  • 组合数学相关恒(不)等式
    \(\texttt{First}\):组合数本身相关性质\[C_n^{m}=C_{n}^{n-m}\]\[C_n^m=\dfrac{n}{m}\timesC_{n-1}^{m-1}\]\[C_{n}^m=C_{n-1}^{m}+C_{n-1}^{m-1}\]杨辉三角。\[C_{n}^{m}=\dfrac{n-m+1}{m}\timesC_{n}^{m-1}\]展开即得,可以作为\(n\)确定,\(m\)不定的递推式......
  • 疯了‼️ 3校公布24复试线!数学单科线140!
    感觉这个世界要疯了?!!总分分数线420!数学单科线140!!在24英语数学难上热搜之后,又迎来了国家线普涨,复试线新高。国家线公布后,清华大学、北京大学、中山大学率先公布了24考研的学校基本复试线。清华应统分数线420,数学单科线140.这个世界疯了?!!数三的24卷虽然不像数一那么冷门......
  • kettle从入门到精通 第五十课 ETL之kettle 课程源文件分享
    Kettle是一款功能强大的开源ETL工具,被广泛应用于数据集成、数据转换和数据加载等领域。随着数据量和多样性的不断增加,使用Kettle进行数据处理已成为许多企业和数据工程师的首选。在过去的几个月里,我已经撰写了将近50篇关于Kettle的文章,涵盖了各种主题和用例,如数据抽取、数......