zoukankan      html  css  js  c++  java
  • YYHSOI模拟赛题解(T4完全平方数)

      

    题目描述

    一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(Pefect Sqaure),也称平方数。

    小A认为所有的平方数都是很perfect的~

    于是他给了小B一个任务:用任意个不大于n的不同的正整数相乘得到完全平方数,并且小A希望这个平方数越大越好。

    请你帮助小B告诉小A满足题意的最大的完全平方数。

    输入

    输入文件名为number.in 

     

    输入仅 1行,一个数n

     

    输出

    输出文件名为number.out

    输出仅1行,一个数表示答案。由于答案可以很大,所以请输出答案对100000007取模后的结果。

    样例输入

    【输入输出样例1】
    number.in
    7
    number.out
    144
    【输入输出样例解释1】
    144=2×3×4×6,是12的完全平方。

    样例输出

    【输入输出样例2】
    number.in
    9
    number.out
    5184
    【输入输出样例解释2】
    5184=3×4×6×8×9,是72的完全平方。

    提示

    【数据范围】


    对于20%的数据,0<n≤100;


    对于50%的数据,0<n≤5,000;


    对于70%的数据,0<n≤100,000;


    对于100%的数据,0<n≤5,000,000。

    这一道题目,我一看就觉得是质因数分解,但是由于数据范围是500W,所以对于一般的筛法就不可行了,所以这一道题目需要用到欧拉线性筛来筛出所有的质数。但是筛完后对于分解质因数仍然没有帮助。然后我就想到了初中数学所学过的,如果对于一个范围内的数质因数分解后存在几个PP为质数),我们有一个求和式,我就把这个用上去了。然后这道题目的时间复杂度就变成了约为2000W的一个算法

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 
     7 using namespace std;
     8 
     9 int N;
    10 long long Mod=100000007;
    11 bool flag[5000005];
    12 int p[5000005];
    13 long long s[5000005];
    14 int num;
    15 int top=0;
    16 int q[5000005];
    17 
    18 long long mul(int a,long long b,long long Mod)
    19 {
    20     long long tmp=1;
    21     long long A=(long long) a;
    22     while (b)
    23     {
    24         if (b & 1) tmp=((tmp % Mod) * (A % Mod)) % Mod;
    25         A=(A % Mod) * (A % Mod) % Mod;
    26         b=b >> 1;
    27     }
    28     return tmp;
    29 }
    30 
    31 int main()
    32 {
    33     scanf("%d",&N);
    34     for (int i=2; i<=N; i++)
    35     {
    36         if (! flag[i])
    37         {
    38             p[++num]=i;
    39         }
    40         for (int j=1; p[j] * i <= N && j<=num; j++)
    41         {
    42             flag[p[j]*i]=1;
    43             if (i % p[j] == 0) break;
    44         }
    45     }
    46     /*for (int i=2; i<=N; i++)
    47     {
    48         if (! flag[i])
    49         {
    50             continue;
    51         }
    52         int X=i;
    53         for (int j=1; j<=num; j++)
    54         {
    55             while (X % p[j] == 0)
    56             {
    57                 s[p[j]]++;
    58                 X=X / p[j];
    59             }
    60             if (X == 0) break;
    61         }
    62     }*/
    63     for (int i=1; i<=num; i++)
    64     {
    65         for (long long j=p[i]; j<= N; j*=p[i])
    66         {
    67             s[p[i]]+=(long long) N / j;
    68         }
    69     }
    70     long long ans=1;
    71     for (int j=1; j<=num; j++)
    72     {
    73         //printf("%d %d\n",p[j],s[p[j]]);
    74         int i=p[j];
    75         long long b=s[i];
    76         if (b & 1) b--;
    77         if (b == 0) continue;
    78         long long tmp=mul(i,b,Mod);
    79         ans=(ans % Mod) * (tmp % Mod) % Mod;
    80     }
    81     printf("%lld\n",ans);
    82     return 0;
    83 }
    Show My Ugly Code
  • 相关阅读:
    工作中,怎么做好规范
    每日一链
    模仿电子商务垂直菜单
    电脑不同的分辨率自适应显示
    怎样成为一位合格的程序员
    巅峰极客线上第一场ctf——RE
    恶意代码分析常见Windows函数
    巅峰极客线上第二场部分ctf
    恶意代码分析:虚拟网络环境配置
    0ctf2017 pwn babyheap
  • 原文地址:https://www.cnblogs.com/TUncleWangT/p/7064872.html
Copyright © 2011-2022 走看看