Problem 1. How many primes?
求 {1, 2, . . . , N } 中素数的个数。
Input
1 个整数 N 。
Output
1 个整数,表示素数的个数。
Note
• 对于 40% 的数据,1 ≤ N ≤ 10^6
• 对于 80% 的数据,1 ≤ N ≤ 10^7
• 对于 100% 的数据,1 ≤ N ≤ 10^8
题解:这是要我打个线性筛么?
注意,数据丧狂,only线性筛
代码如下code
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define maxn 100000009 5 int n,cnt; 6 bool p[maxn]; 7 int prime[maxn]; 8 void get() 9 { 10 p[1]=0; 11 for(int i=2;i<=n;i++) 12 { 13 if(!p[i])prime[++prime[0]]=i; 14 for(int j=1;j<=prime[0];j++) 15 { 16 if(prime[j]*i>n)break; 17 p[i*prime[j]]=true; 18 if(i%j==0)break; 19 } 20 } 21 } 22 int main() 23 { 24 cin>>n; 25 get(); 26 for(int i=1;i<=n;i++) 27 { 28 if(p[i])cnt++; 29 } 30 cout<<cnt<<endl; 31 return 0; 32 } 33 //我没测试,不过应该对
Problem 2. How many rooks?
N × N 的国际象棋棋盘上有 K 个车,第 i 个车位于第 Ri 行,第 Ci 列。求至少被一个车攻击的格子数量。
Input
第 1 行,2 个整数 N, K。
接下来 K 行,每行 2 个整数 Ri , Ci 。
Output
1 个整数,表示被攻击的格子数量。
Note
• 对于 30% 的数据,1 ≤ N ≤ 10^3, 1 ≤ K ≤ 10^3;
• 对于 60% 的数据,1 ≤ N ≤ 10^6, 1 ≤ K ≤ 10^6;
• 对于 100% 的数据,1 ≤ N ≤ 10^9, 1 ≤ K ≤ 10^6, 1 ≤ Ri , Ci ≤ N 。
正解:hash一下
详细的说:
我们求一个车能攻击到的范围,可以转化一下,转化成求解剩余的格子的数目,然后我们用总数减去剩余格子数就好了。
事实上画个图的话如下
如图,我们放入一个车之后,我们可以得到一张新的图:相当于长和宽都减少1的图.但是要注意判重,重复的时候是不会再减少的(能明白么?)
然后我用了很奇葩的方法,这里就不贴自己的代码了。处理好行和列的判重与计数就好了。