当前位置:   article > 正文

P5440 【XR-2】奇迹 (大模拟dfs+欧拉筛板子+闰年)

P5440 【XR-2】奇迹 (大模拟dfs+欧拉筛板子+闰年)

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P5440

相信奇迹的人,本身就和奇迹一样了不起。——笛亚 《星游记》

思路历程:很离谱的一题,在理论上并不困难,只要简单dfs+欧拉筛就能过。在一开始,我采用了倒着模拟的思路,用stoi函数,强转字符串,发现样例能跑,但是仍旧RE(现在仍未理解这样的原因),于是,我选择了另一种做法,反过来遍历。

下面是代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<set>
  5. #include<string>
  6. using namespace std;
  7. const int N=1e8+5;
  8. int _;
  9. string s;
  10. int ans;
  11. bool nums[N];//这两行
  12. long long f[10000001],cot=0;//这两行是欧拉筛的板子
  13. int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//减少代码量,开一个月份数组
  14. bool check(int num){//检查年份符不符合逻辑
  15. int day=num%100;
  16. int month=(num/100)%100;
  17. int year=num/10000;
  18. if((year%4==0&&year%100!=0)||year%400==0){
  19. months[2]=29;
  20. }
  21. else months[2]=28;
  22. return year>=1&&year<=9999&&month>=1&&month<=12&&day>=1&&day<=months[month];
  23. }
  24. void dfs(int x,int num){//第x层,数字为num
  25. int sum;//记录每一层要加多少
  26. if(x==8&&check(num)&&!nums[num]&&!nums[num%10000]&&!nums[num%100]){//100和10000
  27. ans++;//2 4 8都要是素数
  28. }
  29. else if(x==8) return;//只要是8就返回
  30. else if(s[x]!='-'){
  31. sum=(s[x]-'0')*pow(10,7-x);//字符串转数字 要注意减去‘0’
  32. dfs(x+1,num+sum);
  33. }
  34. else{
  35. if(x==4){//特判优化,减少for的遍历(月份)
  36. for(int i=0;i<2;++i){
  37. sum=i*pow(10,7-x);
  38. dfs(x+1,sum+num);
  39. }
  40. }
  41. else if(x==6){//特判优化(日子)
  42. for(int i=0;i<4;++i){
  43. sum=i*pow(10,7-x);
  44. dfs(x+1,sum+num);
  45. }
  46. }
  47. else{
  48. for(int i=0;i<=9;++i){
  49. sum=i*pow(10,7-x);
  50. dfs(x+1,sum+num);
  51. }
  52. }
  53. }
  54. }
  55. void solve(){
  56. ans=0;
  57. cin>>s;
  58. dfs(0,0);(从第0层开始)
  59. cout<<ans<<endl;
  60. }
  61. int main(){
  62. nums[1]=true;//1不是素数 true就不是素数
  63. long long n=1e8;
  64. for(long long i=2;i<=n;i++)
  65. {
  66. if(!nums[i])
  67. f[cot++]=i;
  68. for(long long j=0;j<cot&&i*f[j]<=n;j++)
  69. {
  70. nums[f[j]*i]=true;
  71. if(i%f[j]==0)
  72. break;
  73. }
  74. }//从开头到这里就是一个欧拉筛的板子
  75. cin>>_;
  76. while(_--){
  77. solve();
  78. }
  79. return 0;
  80. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/115436
推荐阅读
相关标签
  

闽ICP备14008679号