zoukankan      html  css  js  c++  java
  • 平方数

    平方数

    Description

      一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(perfect square),也称平方数。小A认为所有的平方数都是很perfect的~
      于是他给了小B一个任务:用任意个不大于n的不同的正整数相乘得到完全平方数,并且小A希望这个平方数越大越好。请你帮助小B告诉小A满足题意的最大的完全平方数。

    Input

      输入文件名为number.in。
      输入仅一行,一个正整数n。

    Output

      输出文件名为number.out。
      输出仅一行,一个数表示答案。
      由于答案可以很大, 所以请输出答案对108+7取模后的结果。

    Sample Input

    【样例1输入】
      7
    【样例1输出】
      144
    【样例1说明】144=234*6=12^2

    Sample Output

    【样例2输入】
      9
    【样例2输出】
      5184
    【样例2说明】5184=34689=72^2


    思路

    • 找找规律,发现题目所求问题是n!中各质数偶数次方的乘积
    • 要加逆元

    代码

    #include <iostream>
    #include <cstdio>
    using namespace std;
    const int mod=1e8+7;
    const int maxn=5000005;
    int n,keep[348888],cnt;
    long long ans=1;
    bool vis[maxn];
    void sieve(int x)
    {
    	for(int i=2;i<=x;++i) {
    		ans=ans*i%mod;
    		if(!vis[i]) keep[++cnt]=i;
    		for(int j=1;j<=cnt&&i*keep[j]<=x;++j) {
    			vis[i*keep[j]]=1;
    			if(i%keep[j]==0) break;
    		}
    	}
    }
    long long qpow(long long x,long long a)
    {
    	long long ans=1;
    	while(a)
    	{
    		if(a&1) ans=ans*x%mod;
    		x=x*x%mod;
    		a>>=1;
    	}
    	return ans;
    }
    int main()
    {
    	freopen("number.in","r",stdin);
    	freopen("number.out","w",stdout);
    	scanf("%d",&n);
    	sieve(n);
    	for(int i=1;i<=cnt;++i)
    	{
    		long long temp=n,num=0;
    		while(temp) temp/=keep[i],num+=temp;
    		if(num&1) ans=ans*qpow(keep[i],mod-2)%mod;
    	}
    	cout<<ans<<'
    ';
    	return 0;
    }
    
  • 相关阅读:
    BootStrap2学习日记15----选项卡
    BootStrap2学习日记14----导航
    Google地图下载工具代码
    SqlServer 动态SQL(存储过程)中Like 传入参数无正确返回值的问题
    地球坐标-火星坐标-百度坐标及之间的转换算法 C#
    GIS基础知识
    Gps坐标有效性判定
    Gps坐标距离计算C#实现
    C# 对字段忽略模型校验
    SQL基础复习2
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/14062407.html
Copyright © 2011-2022 走看看