51nod-1359: 循环探求
【传送门:51nod-1359】
简要题意:
给出n和k,求出最小的x满足$n^{x}≡n(mod\;10^{k})$
题解:
真是一道有(du)趣(liu)题目
首先我们设X[k-1]为$n^{x}≡n(mod\;10^{k-1})$成立的最小的x
那么我们就可以得到$n^{X[k-1]}≡n(mod\;10^{k-1})$
设$N[k-1]=n^{X[k-1]}$
设t为任意值,可以发现$n^{t*X[k-1]}≡N[k-1]^{t}(mod\;10^{k-1})$
假设t*X[k-1]为满足$n^{x}≡n(mod\;10^{k})$的最小的x的话,其实可以知道变的只有第k位,而第1到第k-1位仍然是不变的,那么我们对于一个k就枚举t,因为抽屉原理,所以N[k-1]^t的第k位最多只有10种情况,t枚举到12都仍未找到则说明不存在x,就直接输出1
否则将得到的t连乘,最后+1就是答案了
PS:为了不超时,高精度的时候要控制长度在k以内,不会影响结果
参考代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
struct node
{
int a[],len;
node()
{
len=;
memset(a,,sizeof(a));
}
}N,d;
char st[];int k;
node multi(node n1,node n2)
{
node no;no.len=k;
for(int i=;i<=k;i++)
{
for(int j=;j+i-<=k;j++) no.a[i+j-]+=n1.a[i]*n2.a[j];
}
for(int i=;i<=no.len;i++)
{
no.a[i+]+=no.a[i]/;
no.a[i]%=;
}
return no;
}
node solve(node n1,int n2)
{
node no;no.len=n1.len;
for(int i=;i<=no.len;i++) no.a[i]=n1.a[i]*n2;
for(int i=;i<=no.len;i++)
{
no.a[i+]+=no.a[i]/;
no.a[i]%=;
}
int i=no.len;
while(no.a[i+]>)
{
i++;
no.a[i+]+=no.a[i]/;
no.a[i]%=;
}
no.len=i;
return no;
}
int main()
{
scanf("%s%d",st+,&k);
int len=strlen(st+);N.len=len;
for(int i=;i<=len;i++) N.a[i]=st[len-i+]-'';
d.a[]=;d.len=;
node B=N,p,x;
for(int i=;i<=k;i++)
{
int t=;
x=B;
while(t<=)
{
p=multi(N,B);
if(p.a[i]==N.a[i]) break;
B=multi(B,x);t++;
}
if(t>){printf("1\n");return ;}
d=solve(d,t);
}
d.a[]++;
for(int i=;i<=d.len;i++)
{
d.a[i+]+=d.a[i]/;
d.a[i]%=;
}
int i=d.len;
while(d.a[i+]>)
{
i++;
d.a[i+]+=d.a[i]/;
d.a[i]%=;
}
d.len=i;
for(int i=d.len;i>=;i--) printf("%d",d.a[i]);
printf("\n");
return ;
}
51nod-1359: 循环探求的更多相关文章
- 51nod 1050 循环数组最大子段和
题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; l ...
- 51nod 1050 循环数组最大子段和 (dp)
http://www.51nod.com/onlineJudge/questionCode.html#problemId=1050¬iceId=13385 参考:http://blog. ...
- 51nod 1050 循环数组最大子段和 单调队列优化DP
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这个呢,这个题之前 求一遍最大值 然后求一遍最小值 ...
- 51Nod 1050 循环数组最大子段和 | DP
Input示例 6 -2 11 -4 13 -5 -2 Output示例 20 分析: 有两种可能,第一种为正常从[1 - n]序列中的最大子字段和:第二种为数组的total_sum - ([1-n] ...
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该 ...
- 51nod 1050 循环数组最大子段和【动态规划】
N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n] ...
- 基础dp 记录
51nod 1134 最长递增子序列 #include<iostream> #include<cstdio> #include<cstring> #include& ...
- 51nod 循环数组最大子段和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 对于普通的数组,只要求一次最大子段和即可.但是这题是可以循环的,所 ...
- 51nod 1035 最长的循环节 数学
1035 最长的循环节 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1035 Description 正整 ...
随机推荐
- 浅析PHP中cookie与session技术
1.cookie是什么? cookie指某些站点为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 通俗来理解就是,你去一个专卖店或者超市买东西,然后店里给你办一张 ...
- 19.QT对话框(文件对话框,颜色对话框,字体框,自定义对话框)
文件对话框 #include<QFileDialog> //文件对话框 void Dialog::on_pushButton_clicked() { //定义显示文件的类型 窗口标题 可供 ...
- 探讨:crond 引发大量sendmail进程的解决办法
某服务器账号comm无法登录,说是资源消耗完毕.于是用另一个账号登陆到服务器,检查common账号到底启动了哪些dd引起资源耗尽:ps -u common发现有个 sendmail的启动特别多例如:c ...
- Oracle 新手语法记录
一.用户 1. 创建用户 语法:create user 用户名 identified by 口令; create user test identified by test; 2. 修改用户 语法:al ...
- Rabbit MQ 学习 (一)Window安装Erlang环境
之前也没有用过Rabbit MQ ,最近正在学习中,记性不好,特意记一下. 百度一下 先得 安装 Erlang 并且 设置环境变量. 在Erlang 官网去下载,那个慢呀... 还好CSDN 里有人提 ...
- JavaScript系列--浅析原型链与继承
一.前言 继承是面向对象(OOP)语言中的一个最为人津津乐道的概念.许多面对对象(OOP)语言都支持两种继承方式::接口继承 和 实现继承 . 接口继承只继承方法签名,而实现继承则继承实际的方法.由于 ...
- 修改WebAPI路由控制访问
1.方式一:修改RouteConfig.cs文件 2.方式二:通过在方法上方添加[Route("api/XXXX")]来控制
- UWP 开发相关
OCR 识别问题 ocr.OcrEngine.availableRecognizerLanguages 如果 length 只有 1,有可能只能识别英文,需要安装中文语言包~
- html5中canvas(2)
1.绘制图片(drawImage)(重点) 1.1 基本绘制图片的方式 context.drawImage(img, x, y); 参数: img 可以为:图片.视频或者canvas画布 x,y 绘制 ...
- MySQL监控SQL及命中率脚本
[root@hank-yoon scrips]# vi mysqlstat.sh/export/servers/mysql/bin/mysqladmin -P3306 -uyoon -pyoon ...