同余问题习题总结

1.学号问题

对于这道题而言,重要的是如何比较余数的问题,我们可以利用桶排法来进行

解题。

代码如下

#include<iostream>
#include<vector>
using namespace std;
/*
找到一个最小的数m,使得当前的数对m都不同余
我们可以利用桶排法的思想,如果那个余数存在那么就为1,
本来为0,如果下次继续碰到那么可以直接退出
*/

void main()
{
	int m, n;
	cin >> m;
	bool find = true;
	while (m--)
	{
		cin >> n;
		vector<int> a;
		for (int i = 0; i < n; i++)
		{
			int t;
			cin >> t;
			a.push_back(t);
		}
		for (int i = 1;; i++)
		{
			find = true;//注意保留原来的状态
			vector<int> b(9999999, 0);
			for (int j = 0; j < a.size(); j++)
			{
				if (b[a[j] % i])
				{
					find = false;
					break;
				}
				b[a[j] % i] = 1;
			}
			if (find)
			{
				cout << i << endl;
				break;
			}
		}
	}
	

	system("pause");

}

2.斐波那契数列对于被3整除的问题

问题的f0=7 f1=11;这个数字虽然现在比较小,但是可能到了后面会超出整数的

范围,那么我们应该进行预处理

例如f(n)=(f(n-1)%3+f(n-2)%3)%3;

代码如下

#include<iostream>
#include<vector>
using namespace std;
/*对于斐波那契数列的判断,由于当n的数字增大时我们可能超出
整数的范围,那么我们可以进行预处理
*/
vector<int> a(100000, 0);
void pr()
{
	a[0] = 7;
	a[1] = 11;
	for (int i = 2; i < 100000; i++)
	{
		a[i] = (a[i - 1]%3 + a[i - 2]%3)%3;
	}
	a[0] = 7 % 3;
	a[1] = 11 % 3;
}

void main()
{
	int n = 0;
	cin >> n;
	if (!a[n])
	{
		cout << "yes" << endl;
	}
	else
	{
		cout << "no" << endl;
	}



	system("pause");

}

总结

  1. 对于桶排序的思想要理解,例如对于判断是否任意两个都不一样可以使用
  2. 对于数字最后可能比较大的情况下,注意要明白可以利用快速幂的思想
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值