zoukankan      html  css  js  c++  java
  • 【NOIP模拟赛】【数学】完全平方数

    问题描述

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

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

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

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

    输入

    输入文件名为number.in

    输入仅 1行,一个数n。

    输出

    输出文件名为number.out

    输出仅1行,一个数表示答案。由于答案可以很大,所以请输出答案对100000007(注意!10^8+7)取模后的结果。

    输入输出样例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。

    题解

    这题可以简化为在[1,n]中取任意个数,组成最大的形如ans=a^(2*Na)*b^(2*Nb)*……的数即可

    很容易发现大于n/2+1的数和质数都不能选择作为底数

    而在剩下的数中我们可以枚举i,在[1,n]数字中将每个数字分解为i^xi*φ的形式,记录下Σxi

    易证Σxi只有为偶数时才能组成完全平方,取i^(Σxi),

    当Σxi为奇数时我们取i^(Σxi-1)

    所以 答案就为Σ(i^(Σxi-1))

     1 #include<iostream>
     2 #include<cstdlib>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 
     9 long long n,ans;
    10 bool zs[50000005];
    11 
    12 long long query(long long);
    13 long long work(long long,long long);
    14 int main()
    15 {
    16     long long i,j,sum;
    17     scanf("%I64d",&n);
    18     for(i=2;i<=n/2+1;i++)
    19       if(!zs[i]) for(j=2;i*j<=n;i++) zs[i*j]=true;
    20     
    21     ans=1;
    22     for(i=2;i<=n/2+1;i++)
    23     {
    24         if(!zs[i])
    25         { 
    26             cout<<"*"<<i<<endl;
    27             j=0;
    28             sum=query(i); cout<<sum<<endl;
    29             if(sum%2!=0) sum--;
    30             if(sum!=0) j=work(i,sum); cout<<j<<endl;
    31             if(j!=0) ans=(ans*j)%100000007; 
    32         }
    33     }
    34     printf("%I64d",ans);
    35     return 0;
    36     
    37 }
    38 
    39 long long query(long long v)
    40 {
    41     long long ans,x;
    42     ans=0;
    43     x=n; 
    44     for(;x>0;x/=v,ans+=x); 
    45     return ans;
    46 }
    47 
    48 long long work(long long a,long long b)
    49 {
    50     long long ans=1,x=a%100000007;
    51     for(;b>0;b/=2,x=(x*x)%100000007) if(b%2!=0) ans=(ans*x)%100000007;
    52     return ans;
    53 }
    View Code

     

     



     

  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/yljiang/p/5492464.html
Copyright © 2011-2022 走看看