这几道题就是找规律,找到了数学规律然后给数组赋值就可以了,还用到一个错位排序的公式,斐波那契数列最后注意规律要找对了,数据类型要正确,还有一些细节问题。

杭电ACM(2040-2049)

//2040亲和数
#include <iostream>

using namespace std;

long func(long x)
{
	long result = 0;
	for(int i=1;i<x;i++)
	{
		if(x%i == 0)
			result += i;
	}
	return result;
}

int main()
{
	int m;
	long a,b;
	cin>>m;

	for(int i=0;i<m;i++)
	{
		cin>>a>>b;
		//判断
		if(func(a) == b && func(b) == a)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}

	return 0;
}

杭电ACM(2040-2049)

//2041超级楼梯
#include <iostream>

using namespace std;

int main()
{
	int n,m;
	long num[40] = {1,2};
	cin>>n;
	//按照规律设置数组的值
	for(int i=2;i<40;i++)
	{
		num[i] = num[i-2]+num[i-1];
	}

	for(int i=0;i<n;i++)
	{
		cin>>m;
		cout<<num[m-2]<<endl;
	}

	return 0;
}

杭电ACM(2040-2049)

//2042不容易系列之二
#include <iostream>

using namespace std;

int main()
{
	int n;
	int a;
	int count;
	cin>>n;

	for(int i=0;i<n;i++)
	{
		cin>>a;
		count = 3;
		for(int j=0;j<a;j++)
		{
			count = (count-1)*2;
		}
		cout<<count<<endl;
	}

	return 0;
}

杭电ACM(2040-2049)

//2043密码
#include <iostream>
#include <string>

using namespace std;

int main()
{
	int n;
	cin>>n;
	cin.ignore();
	string str;
	int a,b,c,d;

	for(int i=0;i<n;i++)
	{
		a = b = c = d = 0;
		getline(cin,str);
		//进行判断
		for(int j=0;j<str.size();j++)
		{
			if(str[j] >= '0' && str[j] <= '9')
				a = 1;
			else if(str[j] >= 'a' && str[j] <= 'z')
				b = 1;
			else if(str[j] >= 'A' && str[j] <= 'Z')
				c = 1;
			else
				d = 1;
		}
		if((a+b+c+d)>2 && (str.size()>=8 && str.size()<=16))
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}

	return 0;
}

杭电ACM(2040-2049)

//2044一只小蜜蜂... 斐波那契数列
#include <iostream>
#include <string>

using namespace std;

int main()
{
	int n;
	cin>>n;
	int a,b;
	//为斐波那契数列复制
	long long count[50] = {0,1,2};
	for(int i=3;i<50;i++)
	{
		count[i] = count[i-1]+count[i-2];
	}

	for(int i=0;i<n;i++)
	{
		cin>>a>>b;
		cout<<count[b-a]<<endl;
	}

	return 0;
}

杭电ACM(2040-2049)

//2045不容易系列之(3)—— LELE的RPG难题
#include <iostream>

using namespace std;

int main()
{
	int n;
	long long num[51] = {0,3,6,6};
	//找到规律是关键问题
	for(int i=4;i<51;i++)
	{
		num[i] = 2*num[i-2]+num[i-1];
	}

	while(cin>>n)
	{
		cout<<num[n]<<endl;
	}

	return 0;
}

杭电ACM(2040-2049)

//2046骨牌铺方格 斐波那契数列
#include <iostream>

using namespace std;

int main()
{
	int n;
	long long num[51] = {0,1,2};
	for(int i=3;i<51;i++)
	{
		num[i] = num[i-1]+num[i-2];
	}

	while(cin>>n)
	{
		cout<<num[n]<<endl;
	}
	return 0;
}

杭电ACM(2040-2049)

//2047阿牛的EOF牛肉串
#include <iostream>

using namespace std;

int main()
{
	int n;
	_int64 num[40] = {0,3,8};
	for(int i=3;i<40;i++)
	{
		num[i] = (num[i-2]+num[i-1])*2;
	}

	while(cin>>n)
	{
		cout<<num[n]<<endl;
	}

	return 0;
}

杭电ACM(2040-2049)

//2048神、上帝以及老天爷 错排问题
#include <iostream>
#include <iomanip>

using namespace std;

/*
这道题是一个错排问题,错排问题值得就是将n个元素放在n个位置,而这个位置还元素原来的位置不同,比如将排列的10本书
重新放置,位置不能是原来的位置,或者10个人互赠贺卡,自己总不能收到自己的贺卡吧,这也是错排的问题,需要知道错排
的公式,f(n)=(n-1)(f(n-1)+f(n-2)),f(n)表示的就是n个数的错排数量,可以这样理解这个公式:假如将一个数放置在其他的位
置k上,有n-1种方法,如果在k位置上的数也放在了放在他的位置上的数的原先的位置上,这个时候就会对剩下的n-2个数错排
了,如果放置在k的位置上,k没有放置在放置在他位置上的数的原先位置上,这个时候需要对n-1个数错排了,这样就推倒出了
这个公式
*/

int main()
{
	int c;
	int n;
	cin>>c;
	long long mul;

	//利用错排公式对数组进行赋值
	long long num[21] = {0,0,1,2};
	for(int i=4;i<21;i++)
	{
		num[i] = (i-1)*(num[i-1]+num[i-2]);
	}

	//读取输入数据
	for(int i=0;i<c;i++)
	{
		cin>>n;
		//题目说的是不中奖的概率。
		mul = 1;
		//求n的阶乘
		for(int i=2;i<n+1;i++)
		{
			mul *= i;
		}

		//n个人抽奖一共有n!中抽法
		cout<<fixed<<setprecision(2)<<(num[n]*1.0/mul)*100<<"%"<<endl;
	}

	return 0;
}

杭电ACM(2040-2049)

//2049不容易系列之(4)——考新郎 错位排序
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
	int c;
	int n,m;
	cin>>c;
	//为错位排序的数组赋值
	_int64 num[21] = {0,0,1,2};
	for(int i=4;i<21;i++)
	{
		num[i] = (i-1)*(num[i-1]+num[i-2]);
	}

	_int64 x;
	_int64 y;
	for(int i=0;i<c;i++)
	{
		cin>>n>>m;
		//有n-m个新郎找对了新娘
		x = 1;
		y = 1;
		//用以下的方法求C(n)(n-m) n在下 n-m在上
		for(int j=n ,k=0;k<n-m;j--,k++)
		{
			x *= j;
		}
		for(int j=2;j<n-m+1;j++)
		{
			y *= j;
		}
		//m个新郎进行错位排序
		cout<<num[m]*x/y<<endl;
	}

	return 0;
}