NYOJ 362 解题报告
来源:互联网 发布:什么是淘宝客服工作 编辑:程序博客网 时间:2024/06/05 04:33
小明的密钥
- 描述
- 小明想出了一种新的编写密码的方法,给出一个公开密钥N=A^B(1<=A,B<=1000000),假定N的因子有 a[0], a[1], a[2], …, a[k-1],而a[0], a[1], a[2], …, a[k-1]的因子个数分别为t[0],t[1],t[2],…,t[k-1],那么他的私人密钥M为t[0],t[1],t[2],…,t[k-1]的立方和。现在需要你编写一个程序来帮小明实现由公开密钥转化为私人密钥的功能。
- 输入
- 有多组测试数据,每组测试数据有两个数A,B(1<=A,B<=1000000)。输入以文件结束为标志。
提醒:大约有50000个测试数据,注意你的计算方法能在给定的时间内完成该测试。 - 输出
- 每一组测试数据,输出M对10007求余后的的值。
- 样例输入
2 21 14 7
- 样例输出
Case 1: 36Case 2: 1Case 3: 4393
这道题对数论的要求蛮高的。首先我们先来从数学的角度分析分析这道题。
由算数基本定理,对于一个大于1的正整数A,其定能做素分解为A=(p1^s1)*(p2^s2)*…*(pt^st),因此N=A^B=(p1^(s1*B))*(p2^(s2*B))*…*(pt^(st*B))。我们只需要对A做素幂分解,再将幂指数乘上B即可。
而题目中要求的函数可以记为,这里是因子个数函数,计算公式为。可以证明F(N)为积性函数。积性函数F指对于(a, b)=1,有F(ab)=F(a)F(b)。而已知为积性函数,所以为积性函数,所以F为积性函数。所以F(N)=F(A^B)=F((p1^(s1*B))*(p2^(s2*B))*…*(pt^(st*B)))=F(p1^(s1*B))*F(p2^(s2*B))*…*F(pt^(st*B))。而对于其中的第i项,1<=i<=t,有
不过若是A=1,那么就不能做素幂分解,直接输出1即可。
不过要注意的是,由于(si*B+1)和(si*B+2)为整数,直接除以4有可能会出现取整导致错误。所以要变形为,因为两个数一定一奇一偶,相差一定为偶数,除以二一定是整数。
最后还有一点需要注意的,就是素数打表要打到多少?题目中说A最大为1000000,但是我们没有必要一直计算素数到1000000。试想,假如A有一个小于sqrt(1000000)=1000的因子,那么A除以这个因子后的数假如没有小于1000的因子,那么它只能是大于1000的素数,不然除完后的数一定能找到小于1000的因子。假如A就是一个素数,那么2—1000内的素数都不是A的因子,那么就可以直接说A是一个素数。综上,我们只要打表到1000即可。
最后附上我的代码。
#include <stdio.h>#include <math.h>#include <memory.h>int Prime(long long n){long long i,flag=0;for(i=2;i<=(long long)sqrt(n);i++){if(n%i==0){flag=1;break;}}if(flag==1)return 0;elsereturn 1;}int main(){long long prime[200]={0};int i,j=0;prime[j++]=2;for(i=3;i<=1050;i+=2){if(Prime(i)==1)prime[j++]=i;}long long a,b,case_time=0;while((scanf("%lld %lld",&a,&b))!=EOF){case_time++;if(a==1)printf("Case %lld: %d\n",case_time,1);else{int flag=0;long long mod=1;long long n=0;long long temp=0;for(i=0;prime[i]!=0;i++){flag=0;n=0;if(a==1)break;while(a%prime[i]==0){n++;a/=prime[i];flag=1;}if(flag==1){n=n*b;temp=(((n+1)*(n+2))/2)%10007;mod=(mod*temp)%10007;mod=(mod*temp)%10007;}}if(a>1) { temp=(((b+1)*(b+2))/2)%10007; mod=(mod*temp)%10007; mod=(mod*temp)%10007; }printf("Case %lld: %lld\n",case_time,mod);}}return 0;}
- NYOJ 362 解题报告
- NYOJ解题报告~
- NYOJ 46 解题报告
- NYOJ 1 解题报告
- NYOJ 458 解题报告
- NYOJ 314 解题报告
- NYOJ 541 解题报告
- NYOJ 570 解题报告
- NYOJ 520 解题报告
- NYOJ 998 解题报告
- NYOJ 865 解题报告
- NYOJ-263解题报告
- NYOJ-833解题报告
- NYOJ 10 Skiing 解题报告
- NYOJ 448 寻找最大数 解题报告
- NYOJ 448 寻找最大数 解题报告
- NYOJ 84 阶乘的0 解题报告
- NYOJ 455题 解题报告-黑色帽子
- 生成sqlite3.lib for bcb/vc
- 算法导论 第十三章:红黑树
- 字典树的应用 单词意义查找-C语言实现
- hadoop中最简单最简单的map-reduce
- 前台jsp控件获取java后台返回的值
- NYOJ 362 解题报告
- 循环语句的小程序
- 有继承的C++析构函数一定要用virtual
- iOS C语言4_一维数组
- Sublime Text2使用技巧
- hmm-前向算法
- Xen虚拟机桥接网络配置
- SQL server 存储过程
- ★C++课程实训:银行储蓄系统(多文件组织)