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 正整 ...
随机推荐
- UI组件之AdapterView及其子类(五)ListView组件和ListActivity
ListView组件是一个显示组件,继承AdapterView基类,前面已经介绍了分别使用ArrayAdapter,SimpleAdapter,扩展BaseAdapter来为LisView提供列表项h ...
- h5-注册成功
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAAGnCAIAAABuMVpqAAAgAElEQVR4nOy9eXQTd57om2R6uvtO3z ...
- listView 多个item布局
package kds.szkingdom.wo.android.adapter; import java.util.List; import android.content.Context; imp ...
- 【POJ 2482】 Stars in Your Windows
[题目链接] http://poj.org/problem?id=2482 [算法] 线段树 + 扫描线 [代码] #include <algorithm> #include <bi ...
- .NET平台开源JSON序列化
转载: http://blog.csdn.net/ddgweb/article/details/39643747 一个简单示例: String str = "{’name’:’cyf’,’i ...
- 不用copy代码--eclipse使用git提交项目-转
原文地址:http://blog.csdn.net/u014079773/article/details/51595127 准备工作: 目的:eclipse使用git提交本地项目,提交至远程githu ...
- vue入门--简单嵌套路由的一个路径小问题
假设现在有一个项目,刚进去要显示main页面下的contorl页面,那么路由里面的初级路由应该是{main和err},这两个是同一级,然后{control和set}是main下的子路由,foot是这两 ...
- Windows 10 的功能更新,版本 1809 - 错误 0x80070002
一般是双硬盘导致的问题,请打开电脑拆掉系统盘以外的硬盘,一般为固态硬盘和物理硬盘同时使用的电脑会出现此错误.
- Node.js获取本机IP
function getIPAdress() { var interfaces = require('os').networkInterfaces(); for (var devName in int ...
- JAVA 日期工具类的总结
一般,在项目中,我们会会经常使用到日期的各种方式的处理,在各个业务逻辑操作中,都需要相关的日期操作,因此,实现项目中的日期工具类的提出,还是十分重要的,下面,就项目中常用到的日期的相关操作方式,做了一 ...