//2040
#include<iostream>
#include<algorithm>
#define MAXN 100
using namespace std;
//判断a的所有的真约数之和是否等于b
int is_N(int a,int b)
{
int sum1 = 0;//记录a的真约数之和
for (int i = 1; i <= a/2; i++)
{
if (a%i == 0)
{
sum1 += i;
}
}
if (sum1 == b)
return 1;
else
{
return 0;
}
}
int main()
{
int m;
cin >> m;
int a, b;
while (m--)
{
cin >> a >> b;
//如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
if (is_N(a,b)&&is_N(b,a))
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}
//2041
//思路:f1=0,f2=1;f3=2;m>2,fn=fn-1+fn-2,简单的递推
//直接递归调用会超时
/*ll recurrence(int m)
{
if (m==1)
{
return 0;
}
else if (m==2)
{
return 1;
}
else if (m==3)
{
return 2;
}
else
{
//递归调用
return recurrence(m - 1) + recurrence(m - 2);
}
}*/
#include<iostream>
#include<algorithm>
#define MAXN 40
typedef long long ll;
ll f[MAXN];
using namespace std;
void setF()
{
int i;
f[1] = 0;
f[2] = 1;
f[3] = 2;
for (i = 4; i <= MAXN ; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
}
int main()
{
int n;
int m;
cin >> n;
//别忘记调用这个函数。细节问题
setF();
while (n--)
{
cin >> m;
cout << f[m] << endl;
}
return 0;
}
//2042
//思路:和前面一道题十分类似,简单的倒着递推
#include<iostream>
#include<algorithm>
#define MAXN 31
int f[MAXN];
using namespace std;
int main()
{
int n;
cin >> n;
int a;
int i;
f[0] = 3;
f[1] = 4;
f[2] = 6;
for ( i = 3; i <= 30; i++)
{
f[i] = 2 * (f[i - 1] - 1);
}
while (n--)
{
cin >> a;
cout << f[a] << endl;
}
return 0;
}
//2043
#include<stdio.h>
#include<string.h>
#define MAXN 51
char str[MAXN];
int main()
{
int m;
scanf("%d",&m);
int count;
int flag1, flag2, flag3,flag4;//分别用来标记是不是含有某一组的字符
int i;
int len;
while (m--)
{
flag1 = 0;
flag2 = 0;
flag3 = 0;
flag4 = 0;
scanf("%s", str);
len = strlen(str);
if (!(len>=8&&len<=16))
{
printf("NO\n");
continue;
}
for (i = 0; i < len; i++)
{
if (str[i]>=‘A‘&&str[i]<=‘Z‘)
{
flag1 = 1;
}
else if (str[i]>=‘a‘&&str[i]<=‘z‘)
{
flag2 = 1;
}
else if (str[i]>=‘0‘&&str[i]<=‘9‘)
{
flag3 = 1;
}
else if (str[i]==‘~‘||str[i]==‘!‘||str[i]==‘@‘||str[i]==‘#‘||str[i]==‘$‘||str[i]==‘%‘==str[i]==‘^‘)
{
flag4 = 1;
}
}
//
if ((flag1 + flag2 + flag3 + flag4) >= 3)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
//2044
/*思路:从1到2 的可能路径(共1种):1->2;
从1到3的可能路径(共2种):1->2->3, 1->3;
从1到4的可能路径(共3种):1->2->3->4 ,1->3->4,1->2->4;
从1到5的可能路径(共5种):1->2->3->4->5,1->2->4->5,1->3->4->5,1->2->3->5,1->3->5
......
递推公式:f[n]=f[n-1]+f[n-2],注意的一点就是题目是a->b,所以看的是b-a,也就是相差的步数
*/
#include<stdio.h>
#include<string.h>
#define MAXN 51
typedef long long ll;
ll f[MAXN];
long long F(int a ,int b)
{
int n;
n = b - a;
f[1] = 1;
f[2] = 2;
if (n>2)
{
for (int i = 3; i < MAXN; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
}
return f[n];
}
int main()
{
int n;
int i;
int a, b;
scanf("%d", &n);
while (n--)
{
scanf("%d%d", &a, &b);
printf("%lld\n",F(a,b));
}
return 0;
}
//2045
/*思路:用递推法,1)如果前n-1个格合法,则第一个格颜色和第n-1个格的颜色不同,则此时第n个格的颜色是只有一种可能颜色(因为和第一个格的颜色不能相同,还有和其相邻的第n-1格的颜色也不能相同)
2)如果前n-1个格不合法,第n-1个格和第一个格的颜色相同,且前n-2个格合法,第n格子不能和第n-1个格和第一个格相同,所以第n个格的选择有2种*/
#include<stdio.h>
#include<string.h>
#define MAXN 51
typedef long long ll;
ll f[MAXN];
void setTab()
{
int i;
f[1] = 3;
f[2] = 6;
f[3] = 6;
for ( i = 4; i < MAXN; i++)
{
f[i] = f[i - 1] + 2 * f[i - 2];
}
}
int main()
{
int n;
setTab();
while (~scanf("%d",&n))
{
printf("%lld\n", f[n]);
}
return 0;
}
//2046
#include<stdio.h>
#include<string.h>
#define MAXN 51
typedef long long ll;
ll f[MAXN];
int main()
{
int n;
f[1] = 1;
f[2] = 2;
f[3] = 3;
for (int i = 4; i < 51; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
while (~scanf("%d",&n))
{
printf("%lld\n", f[n]);
}
return 0;
}
//2047
/*递推:1)第n个元素是‘O’,那么第n-1个元素是‘E/F’即两种可能性,前n-2元素是正常f[n-2],故此时的总可能数是2*f[n-2];
2)第n个元素是‘E/F’即两种可能,那么前n-1个元素就没有特殊的要求即f[n-1],故此时的总可能数是2*f[n-1];
f[n]=f[n-1]+f[n-2];
*/
#include<stdio.h>
#include<string.h>
#define MAXN 51
typedef long long ll;
ll f[MAXN];
int main()
{
int n;
f[1] = 3;
f[2] = 8;
for (int i = 3; i < MAXN; i++)
{
f[i] = 2*(f[i - 1] + f[i - 2]);
}
while (~scanf("%d",&n))
{
printf("%lld\n", f[n]);
}
return 0;
}