蓝桥杯 Day11 简单数论

1、阶乘约数

        题目链接:阶乘约数 - 蓝桥云课 

        解题思路:正常情况下是先计算出 n!的大小,再枚举 1~根号n 中的数,找出并统计n的因子及因子个数,但是时间肯定不够。我们使用唯一分解定理约数定理来解决这个问题。

 唯一分解定理:每个大于1的自然数都可以分解为若干质数的乘积

                                            \prod_{i=1} ^{n} p_{i}^{a_{i}} = p_{1}^{a_{1}} * p_{2}^{a_{2}} *\cdots *p_{n}^{a_{n}}

其中p_{i}表示n的第i个质因子,a_{i}表示p_{i}的幂次。

约数定理:n的正约数的个数为

                                \prod_{i=1}^{k}(a_{i}+1)=(a1+1)(a2+1)\cdots (ak+1)

        因此我们只需要对1~100中每个数做质因数分解,统计每个质因子的幂次,在对应相加就能得到100!的每个质因子的幂次。 

分解质因数模板:

int cnt[N];   //cnt[i] 保存质因子 i的幂次 
void divide (int n)
{
	for (int i = 2 ; i * i <= n ; i++)
	{
		if (n % i == 0)
		{
			while (n % i ==0)
			{
				n /= i;
				cnt[i] ++;
			}
		}
	}
	if(n > 1) cnt[n] ++;  //n 是其中一个因子 
}

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int N=110;
 
int cnt[N];   //cnt[i] 保存质因子 i的幂次 
void divide (int n)
{
	for(int i=2; i*i<=n; i++)
	{
		if(n%i==0)
		{
			while(n%i==0)
			{
				n/=i;
				cnt[i]++;
			}
		}
	}
	if(n>1) cnt[n]++;  //n是其中一个因子 
}
int main()
{
	int n=100;
	for(int i=1;i<=n;i++)
	{
		divide(i);
	}
	//约数定理 
	long long ans=1;
	for(int i=1;i<=n;i++)
	{
		if(cnt[i]!=0)
			ans*=(cnt[i]+1);
	}
	cout<<ans<<endl; 
	return 0;
}

 答案:39001250856960000

2、等差数列

        题目链接:等差数列 - 蓝桥云课

输入示例:

5
2 6 4 10 20

输出示例:10 

        解题思路 : 先排序,由等差数列的性质可得  a_{n}= a_{1}+(n-1)*d,则计算出 d 的值之后就能求出 n 的值。d 越大,n就越小。我们记录每一项与 a1 的差值,这个差值必定是 d 的倍数,取所有差值的最大公约数,就是 d 的最大取值。

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
int n,d,a[N];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+1+n);

	for(int i=1;i<=n;i++)
	{
		d=__gcd(d,a[i]-a[1]);
	}
	//若d=0,则a[1]=a[2]= …=a[N] 
	if(!d) 
		cout<<n<<endl;
	else 
		cout<<(a[n]-a[1])/d+1<<endl; 
	return 0;
}

 

3、最大比例 

题目链接:最大比例 - 蓝桥云课

 

输入示例:

3
1250 200 32

输出示例: 

25/4

         解题思路先排序,求出相邻两项之间的比,并将其约分,用两个数组分别保存其分子和分母。然后两个两个求分子和分母的最大公约数,就是答案。

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;

int n, cnt; 
long long a[N],u[N],d[N];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	//排序
	sort(a+1,a+1+n);

	for(int i=2;i<=n;i++)
	{
		if(a[i]==a[i-1]) continue;  
    //求出相邻两项的比并约分,分子分母分开保存
		long long g = __gcd(a[i],a[i-1]);
		u[++cnt] = a[i]/g;
		d[cnt] = a[i-1]/g;
	} 
  //分别求最大公因子
	long long x=u[1],y=d[1];
	for(int i=2;i<=cnt;i++)
	{
		x = __gcd(x,u[i]);
		y = __gcd(y,d[i]);
	}
	cout<<x<<"/"<<y<<endl;
	return 0;
 } 

### 2022年蓝桥杯C语言竞赛真实考题解析 #### 题目概述 为了帮助参赛者更好地准备蓝桥杯C语言竞赛,了解往年的真题是非常有益的。以下是基于2022年第十三届蓝桥杯全国软件和信息技术专业人才大赛的部分C语言编程题目的介绍。 #### 示例题目一:日期计算问题 此题要求编写一个程序来处理特定条件下的日期转换或计算。这类题目通常涉及基础的日历逻辑运算以及边界情况的考虑[^2]。 ```cpp #include <iostream> using namespace std; int main() { int year, month, day; cin >> year >> month >> day; // 假设这里有一个复杂的日期计算函数 processDate() // 它会根据输入的年月日做相应的变换并输出结果 cout << "Processed Date:" << endl; return 0; } ``` #### 示例题目二:数论性质检测 另一个常见的考点是对某些特殊数值特性的识别,如下述例子所示的是关于自同构数(Automorphic number)的判定。该类型的题目旨在考察学生对于数学概念的理解及其应用能力[^3]。 ```cpp bool isAutomorphic(long long num) { long long square = num * num; while (num > 0 && square % 10 == num % 10) { num /= 10; square /= 10; } return num == 0 ? true : false; } int countAutomorphicsUnderLimit(int limit) { int counter = 0; for (long long i = 1; i <= limit; ++i) if (isAutomorphic(i)) ++counter; return counter; } ``` #### 示例题目三:资源分配优化 此类题目可能涉及到贪心算法的应用场景,在给定约束条件下寻求最优解法。下面给出了一段简化版代码片段用于说明如何通过逐步尝试达到最佳方案的选择过程[^4]。 ```cpp void optimizeResourceAllocation() { int total_resources, typeA_cost_per_unit, typeB_cost_per_unit; cin >> total_resources >> typeA_cost_per_unit >> typeB_cost_per_unit; int max_units_possible = total_resources / (5*typeA_cost_per_unit + 2*typeB_cost_per_unit); // 进一步细化剩余资源利用... } ``` 这些只是部分展示,并不代表完整的官方试题内容。实际比赛中还会有更多不同难度级别的挑战等待着各位选手去攻克。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值