• 【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

     

     



     

  • 相关阅读:
    Android studio怎么创建shape的XML文件
    请问如何在PS中将一张图标里的各个小图标分离成一个个图标?
    IOS 开发之 -- 过滤掉字符串里面所有的非法字符 字典和json之间的互转
    ios开发之 -- 5分钟集成融云的客服功能
    ios开发之 --调用系统的页面,显示中文
    IOS 开发之-- textfield和textview,return键的改变,点击return键
    IOS 开发之--获取真机的deviceToeken
    iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
    iOS 开发之--打测试包的时候报错的解决方法
    ios开发之 -- 调用系统定位获取当前经纬度与地理信息
  • 原文地址:https://www.cnblogs.com/yljiang/p/5492464.html
Copyright © 2020-2023  润新知