HDU 4196解题报告
来源:互联网 发布:unity3d 5.0 material 编辑:程序博客网 时间:2024/05/22 05:04
Remoteland
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 1111 Accepted Submission(s): 418
Problem Description
In the Republic of Remoteland, the people celebrate their independence day every year. However, as it was a long long time ago, nobody can remember when it was exactly. The only thing people can remember is that today, the number of days elapsed since their independence (D) is a perfect square, and moreover it is the largest possible such number one can form as a product of distinct numbers less than or equal to n.
As the years in Remoteland have 1,000,000,007 days, their citizens just need D modulo 1,000,000,007. Note that they are interested in the largest D, not in the largest D modulo 1,000,000,007.
As the years in Remoteland have 1,000,000,007 days, their citizens just need D modulo 1,000,000,007. Note that they are interested in the largest D, not in the largest D modulo 1,000,000,007.
Input
Every test case is described by a single line with an integer n, (1<=n<=10,000, 000). The input ends with a line containing 0.
Output
For each test case, output the number of days ago the Republic became independent, modulo 1,000,000,007, one per line.
Sample Input
4934809562975400
Sample Output
4177582252644064736
Source
SWERC 2011
Recommend
lcy | We have carefully selected several similar problems for you: 4187 4188 4189 4190 4191
这个题是要用1~n中尽可能多的数相乘的乘积组成一个完全平方数。求出能够组成的最大的完全平方数。首先就应该想到把1~n中的所有数分解质因数,如果质因子的次数是偶数刚好凑上,如果是奇数,那么只需要除以一个质因子就行了。这样我们就有两种思路,一种是先算出n!然后除上那些次数为奇数的质因子即可。但这样会引入逆元。或者就是直接算乘法,不算除法。预先要保存1~n中所有合数的乘积。相当于n!中除去了素数。然后判断小于n的所有素数在1~n中的个数,如果个数为偶数的话,那么相当于此时保存的合数的乘积中实际上是奇数个该素数的乘积,因而要乘上该素数。第二种方法要更加快一些。
参考代码:
(方法1)
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<map>#include<set>#include<stack>#include<queue>#include<ctime>#include<cstdlib>#include<iomanip>#include<utility>#define pb push_back#define mp make_pair#define CLR(x) memset(x,0,sizeof(x))#define _CLR(x) memset(x,-1,sizeof(x))#define REP(i,n) for(int i=0;i<n;i++)#define Debug(x) cout<<#x<<"="<<x<<" "<<endl#define REP(i,l,r) for(int i=l;i<=r;i++)#define rep(i,l,r) for(int i=l;i<r;i++)#define RREP(i,l,r) for(int i=l;i>=r;i--)#define rrep(i,l,r) for(int i=1;i>r;i--)#define read(x) scanf("%d",&x)#define put(x) printf("%d\n",x)#define ll long long#define lson l,m,rt<<1#define rson m+1,r,rt<<11using namespace std;const int mod=1000000007;int n,s;bool flag[10000010];int prime[1000010];ll res[10000010];ll pow_mod(ll x,int n){ ll ans=1; while(n) { if(n&1) ans=(ans*x)%mod; x=(x*x)%mod; n>>=1; } return ans;}void Prime(){ REP(i,0,10000000) flag[i]=1; flag[0]=flag[1]=0; s=0; int k=floor(sqrt(10000000)+0.5); rep(i,2,k) { if(flag[i]) { prime[s++]=i; for(int j=2; i*j<=10000000; j++) flag[i*j]=0; } } REP(i,k,10000000) if(flag[i]) prime[s++]=i;}int main(){ Prime(); res[0]=1; REP(i,1,10000000) res[i]=(res[i-1]*i)%mod; while(~scanf("%d",&n)&&n) { ll ans=1; for(int i=0; i<s&&prime[i]<=n; i++) { int num=0,t=n; while(t) { num+=t/prime[i]; t/=prime[i]; } if(num&1) ans=(ans*prime[i])%mod; } printf("%I64d\n",(res[n]*pow_mod(ans,mod-2))%mod); }}(方法二)(摘自别人代码)
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 10000002 const int mod = 1000000007; bool a[10000002]={1,1,0}; int p[680000],num=0; int sum[10000002]={0,1}; void prime(){ int i,j; for(i=2;i<3164;i++) if(!a[i]) for(j=i*i;j<N;j+=i) a[j]=1; for(__int64 i=2;i<N;i++) if(!a[i]) p[num++]=i, sum[i]=sum[i-1]; else sum[i]=sum[i-1]*i%mod; //保存i之前所有合数的积 } int main(){ prime(); int i,j,k,temp; __int64 n,ans; while(scanf("%I64d",&n)&&n){ ans=sum[n]; for(i=0;p[i]*2<=n;i++){ int k=0; for(temp=n;temp;) k+=(temp/=p[i]); if(!(k&1)) ans=p[i]*ans%mod; } printf("%I64d\n",ans); } }
0 0
- HDU 4196解题报告
- HDU 3342 解题报告
- HDU 3336 解题报告
- HDU 3335 解题报告
- hdu 2516解题报告
- hdu 1004解题报告
- hdu 2139解题报告
- hdu 1019解题报告
- hdu 1064 解题报告
- HDU 1113 解题报告
- hdu 1068 解题报告
- HDU:2050解题报告
- hdu 4001解题报告
- hdu 1005解题报告
- HDU解题报告--1003
- HDU解题报告--1004
- HDU解题报告--1005
- HDU 1005 解题报告
- 初探Java序列化(Serialization)
- cocos2d-x vs下开发部署到Android时的小问题汇总
- OC基础——三大特性-封装与类方法
- Qt - 自定义QComboBox下拉框的item高度
- POJ 1160 Post Office 四边形不等式优化DP
- HDU 4196解题报告
- Oracle高级查询之over(partition by..)
- jpmp 02
- pat 1038
- 经典算法之(1)全排列
- Unable to locate package build-essential
- php调用coreseek实例
- windy数(数位dp)
- 数组反转试题解答