开始: 2022-06-11 19:00:00

2022年6月双周赛(初级班)

结束: 2022-06-11 21:30:00
当前: 2025-0606-0202 00:21:03  类型:OI 状态:已经结束 

//C. [NOIP2014 普及组] 珠心算测验

#include<bits/stdc++.h>
using namespace std;
int a[110],n,ans;
bool book[20010];//book[i]=1表示i这个数可以被集合中的两个数之和表示
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) book[a[i]+a[j]]=1;
//找出所有能被和表示的数
//由于加数和被加数必须是集合中的两个不同的数,所以j从i+1开始枚举
for(int i=1;i<=n;i++) if(book[a[i]]) ans++;
//如果a[i]这个数能被表示,ans++
cout<<ans;
return 0;
}

 

//D. [NOIP2012 普及组] 质因数分解

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
cout << n / i;
break;
}
}
return 0;
}
/*
思路:
其实这道题并不需要判断枚举到的i是否是质数,
我们从小到大枚举,并验证i是否能被n整除,那么第一个能被n整除的i,一定是质数。
因为如果它不是质数,那么在2~i-1中,一定存在它的因数能够整除它,
既然存在一个数可以整除i,那么自然也可以整除n,但i是第一个能整除n的数,所以i一定是质数。
找到两者中较小的质数后,n/i便是较大的质数。
由于i不可能超过根号n,枚举到i*i<=n即可。
*/