codeforce 246B——Good Sequences

矫情吗;* 2022-08-11 04:58 307阅读 0赞

第一次的尝试的思路是,用dp进行进行搜索,不过在第21组TLE,这也很正常。因为为复杂度是O(n^2),而n的最大值为为10^5.

第二次尝试把所给的数进行素性拆分、定义flag数组,表示前面的每个数对应的最长序列的长度,统计素因子的对应的长度最大值,然后再用素因子的最大值更新所有素因子的长度值。然后数据读完答案就出来了。不过n=1要特殊处理。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. const int maxn=100005;
  8. int prime[maxn],flag[maxn],num;
  9. void sieve()
  10. {
  11. memset(flag,0,sizeof(flag));
  12. int i,j;
  13. for(i=2;i*i<=maxn;i++)
  14. if(!flag[i])
  15. for(j=i*i;j<=maxn;j+=i)
  16. flag[j]=1;
  17. }
  18. int gen_prime()
  19. {
  20. sieve();
  21. flag[0]=1,flag[1]=1;
  22. int count=0;
  23. for(int i=2;i<=maxn;i++)
  24. if(!flag[i])
  25. prime[count++]=i;
  26. return count;
  27. }
  28. int main()
  29. {
  30. int n,cnt;
  31. cnt=gen_prime();//生成10w以内的素数、并统计素数的个数;不过因为CF单组判断,所以浪费了时间。
  32. while(scanf("%d",&n)==1)
  33. {
  34. memset(flag,0,sizeof(flag));
  35. for(int i=1;i<=n;i++)
  36. {
  37. scanf("%d",&num);
  38. int ans=0,tmp=num;
  39. for(int j=0;j<cnt&&tmp!=1;j++)
  40. {
  41. if(tmp%prime[j]==0)//查找素因子对应的长度最大值
  42. {
  43. flag[prime[j]]++;
  44. while(tmp%prime[j]==0)
  45. tmp/=prime[j];
  46. if(ans<flag[prime[j]])ans=flag[prime[j]];
  47. }
  48. }
  49. for(int j=0;j<cnt&&num!=1;j++)
  50. {
  51. if(num%prime[j]==0)//更新素因子对应值
  52. flag[prime[j]]=ans;
  53. while(num%prime[j]==0)
  54. num/=prime[j];
  55. }
  56. }
  57. int anwser=0;
  58. if(n==1)anwser=1;
  59. else
  60. {
  61. for(int j=0;j<cnt;j++)
  62. if(anwser<flag[prime[j]])anwser=flag[prime[j]];
  63. }
  64. printf("%d\n",anwser);
  65. }
  66. return 0;
  67. }

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [uoj#246]套路

    部分分$3:m<=1000$ 当$m>1000$时,必有两个跳蚤的值相同,所以只要枚举$m<=1000$的区间 转载于:https://www.cnblogs.com/lx