51nod 1359 循环探求
1359 循环探求
输入n和k,求最小 x(x>1) x (x > 1)使得
nx%10k==n%10k n^x \% 10^k == n \% 10^k
这里要求 x>1,因为x==1时必然有
n1%10k==n%10k n^1 \% 10^k == n \% 10^k
先回忆朴素的大数乘法运算。
对于两个大数
A,B A,B
令
A∗B=CA*B=C
其中
A[i],B[i],C[i] A[i] , B[i] , C[i]
分别对应大数字的第i为数字
因为:
A∗B % 10k=(A%10k+B%10k)%10k=C%10kA*B \ \%\ 10^k\\=(A\%10^k+B\%10^k)\%10^k\\=C\%10^k
所以:
C[0...k]可以由A[0...k]∗B[0...k]得来其中[0...k]表示对应大数的第0到k位C[0...k]可以由A[0...k]*B[0...k]得来\\其中[0...k]表示对应大数的第0到k位
在大数乘法的过程。直接截断;(建议朴素算法
因为我们要确定一个最小的x 使得
nx的后k位于n的后k位数相同的n^x的后k位于n的后k位数相同的
假设我们已经计算出来了。使得
nx的后k−1位于n的后k−1位数相同的n^x的后k-1位于n的后k-1位数相同的
最小的x,记为
X[k−1]X[k-1]
首先,我们有
nt∗X[k−1]%10k−1=n%10k−1n^{t*X[k-1]}\%10^{k-1}=n\%10^{k-1}
记
nX[k]=N[k]n^{X[k]}=N[k]
那么
nt∗X[k−1]%10k−1=N[k−1]tn^{t*X[k-1]}\%10^{k-1}=N[k-1]^t
随着t的增加 第k位在不断的改变。但是0到k-1位始终不变。
那么第一次出现
N[k−1]t10k=n10k的t时(t>=1)则此时 answer=X[k−1]∗t\frac{N[k-1]^t}{10^k}=\frac{n}{10^k}的t时(t>=1)\\则此时 \ answer=X[k-1]*t
如过我们记录的是循环次数cnt那么t=cnt+1如过我们记录的是循环次数 cnt\\那么t= cnt+1
我们知道 。判断新的一位时,我们用了暴力循环
但这并不意味着很差的时间复杂度
此时。我们只关心 。我们新的一位的数字。而不要去考虑更高位
那么对于这一位。最多有
0,1,2,3,4,5,6,7,8,9 0,1,2,3,4,5,6,7,8,9
割舍原理告诉我们
循环最多11次便会出现之前出现过的数了。
我们吧循环次数设置为20次。如果没有出现我们需要的t 结束循环,
其实可以设置更少的循环次数。
我们假设出现的环 长度为L。从最初状态进入环的路径长度最多为 11-L。
那也就是说 循环11次就已经遍历了所有可能。
下面给出为之前的AC代码
#include <algorithm>
#include <stdio.h>
#include <string.h>
#define MAX 1000000000
#define MAX_ 100000000
using namespace std;
typedef long long LL;
LL G[10]={1};
LL A[100];
LL B[100];
int C[650];
LL U[100];
LL Nx1[100];
LL Nx2[100];
int ans[5000];
int k;
char s[700];
void read()
{scanf("%s %d",s,&k);int len=(int)strlen(s);int deep=0;for(int i=len-1;i>-1;i-=9,deep++)for(int j=i,sz=max(-1,i-9),t=0;j>sz;j--,t++)A[deep]+=G[t]*(LL)(s[j]-'0');
}
void slove1()
{memset(U,0,sizeof(U));for(LL i=0;i<k;i++)for(LL j=0,c=0;j+i<k;j++){U[i+j]+=Nx1[i]*Nx2[j]+c;c=U[i+j]/MAX;U[i+j]-=c*MAX;}for(int i=0;i<k;i++)Nx1[i]=U[i];
}
void slove2()
{memset(U,0,sizeof(U));for(LL i=0;i<k;i++)for(LL j=0,c=0;j+i<k;j++){U[i+j]+=Nx1[i]*B[j]+c;c=U[i+j]/MAX;U[i+j]-=c*MAX;}for(LL i=0;i<k;i++)A[i]=U[i];
}
int main ()
{for(int i=1;i<10;i++)G[i]=G[i-1]*10;read();int K=k;k=k/9+1;for(int i=0;i<k;i++)Nx2[i]=B[i]=A[i];Nx1[0]=1;for(int i=0;i<K;i++){for(int j=0;j<k;j++)A[j]=B[j];int dx=i/9;int dd=i%9;LL IN=(B[dx]/G[dd])%10;do{slove1();slove2();ans[i]++;}while(IN!=((A[dx]/G[dd])%10)&&ans[i]<12);if(ans[i]>11){printf("1\n");return 0;}for(int j=0;j<k;j++)Nx2[j]=Nx1[j];memset(Nx1,0,sizeof(Nx1));Nx1[0]=1;}C[0]=1;int deep=1;for(int i=0;i<K;i++){int j,c;for(j=0,c=0;j<deep||c>0;j++){C[j]*=ans[i];C[j]+=c;c=C[j]/10000;C[j]-=c*10000;}deep=max(deep,j);}C[0]++;int i,c;for(i=0,c=0;i<deep||c>0;i++){C[i]+=c;c=C[i]/10000;C[i]-=c*10000;if(c==0)break;}deep=max(i,deep);deep--;printf("%d",C[deep--]);while(deep>-1)printf("%04d",C[deep--]);printf("\n");return 0;
}
51nod 1359 循环探求相关推荐
- 51nod 1050循环数组最大字段和
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 思路解析:一开始想着直接将长度为n的数组延长至2n-1 ...
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...
- 51Nod 1050 循环数组最大子段和
有两种方式: 1.在首尾之间 2.在尾首之间 对于第一种直接来dp就好,第二种需要将其数组全部取负,然后取到其最大值(肯定是负数的最大值)然后dp即可,最后比较这两个答案谁比较大就输出哪个 1 #in ...
- 中兴面试总结,华为。技术,市场
1,软件测试,如何把这个测试做的更好. 进到一个新项目,作为测试人员应该都是想把测试做好,项目在符合客户质量要求的情况下按时交付的吧.但往往都事与愿违,造成这个结果的原因有很多很多.通过这段时间做自动 ...
- 【51nod - 1050】循环数组最大子段和(dp)
题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...
- NOIP2005普及组第4题 循环
NOIP2005普及组第4题 循环 时间限制: 1 Sec 内存限制: 128 MB 提交: 27 解决: 6 [提交][状态][讨论版][命题人:外部导入] 题目描述 乐乐是一个聪明而又勤奋好学 ...
- 51Nod - 1035 最长的循环节
51Nod - 1035 最长的循环节 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有 ...
- 用forif循环测量minst0-6的特征迭代次数曲线
制作一个网络输入minst的0-6的前5000张图片,将28*28的图片处理成9*9,网络结构是81*49*30*3让这个网络向1,1,1收敛, 将这个网络简写成 S(Minst 0-6)81-(co ...
- 计蒜客/51Nod题目
题目 换位置(1) 链接https://nanti.jisuanke.com/t/T1971 思路:两两交换次序使得数组逆序,第一个到最后位置需要n-1步,第二个到倒数第二个需要n-2步,第三个到倒数 ...
- 51NOD 1125(交换机器最小代价) (贪心) 思想 !思想!
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1125 1125 交换机器的最小代价 基准时间限制:1 秒 ...
最新文章
- 剑指Offer_08_跳台阶
- Lesson 2.张量的索引、分片、合并以及维度调整
- 计算机硬件常见问题及修复,pc机输入输出设备的常见故障现象及故障修复方法...
- 轻松搞定python中模板和包的使用
- C语言程序练习-L1-032 Left-pad (20分)
- RocketMQ消息支持的模式-消息同步发送
- “砸7000万,这样的黑锅我们也不背。” 华人银行家的反击
- vsftpd 源码安装 linux/redhat
- springBoot框架方法上面添加@Transactional注解的使用
- vue-cli 搭建的项目处理不同环境下请求不同域名的问题
- Linux网络配置之虚拟网卡的配置(Red Hat 6.5)
- 程序员养猫,并不是用来撸的!
- matlab读取npy文件
- 北漂生活第十四弹-5.24 兜兜转转又是一周
- 坚果云 android 操作历史,坚果云怎样将文件恢复到某一个历史版本?两招轻松搞定!...
- Visual paradigm试用版绘制ER图时如何去水印
- 微服务-高并发-思路
- 【前端单元测试入门03】Sinon
- 购物车模块redis和mysql_redis解决购物车的问题
- ASP.NET Core MVC_Tag Helper