刚看到这个题目,有点被吓到,毕竟自己这么弱。

分析了很久,然后发现m,k都可以唯一的用d进制表示。也就是用一个ai,和很多个bi唯一构成。

这点就是解题的关键了。 之后可以发现每次调用函数f(x),相当于a(ai),b(bi)了一下。这样根据置换的一定知识,一定会出现循环,而把循环的大小看成取模,把从m->k的看成余,于是可以建立一个线性同余方程。

直接用模板解决之。。

Recurrent Function
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 1102   Accepted: 294

Description

Dr. Yao is involved in a secret research on the topic of the properties of recurrent function. Some of the functions in this research are in the following pattern:

in which set {ai} = {1, 2, …, d-1} and {bi} = {0, 1, …, d-1}.
We denote:

Yao's question is that, given two positive integer m and k, could you find a minimal non-negative integer x that

Input

There are several test cases. The first line of each test case contains an integer d (2≤d≤100). The second line contains 2d-1 integers: a1, …, ad-1, followed by b0, ..., bd-1. The third line contains integer m (0<m≤10100), and the forth line contains integer k (0<k≤10100). The input file ends with integer -1. 

Output

For each test case if it exists such an integer x, output the minimal one. We guarantee the answer is less than 263. Otherwise output a word "NO". 

Sample Input

2
1
1 0
4
7
2
1
0 1
100
200
-1

Sample Output

1
NO

Hint

For the first sample case, we can see that f(4)=7. And for the second one, the function is f(i)=i
//
// main.cpp
// poj3708
//
// Created by 陈加寿 on 15/11/28.
// Copyright (c) 2015年 陈加寿. All rights reserved.
// #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std; int a[],b[];
char strm[],strk[];
int m[],k[];
int savem[],savek[];
int cntm,cntk; void Tentod(int ten[],int len,int &cnt,int d,int save[])
{
int tcnt=;
while(ten[tcnt]==) tcnt++;
cnt=;
while(tcnt<len)
{
for(int i=tcnt;i<len;i++)
{
ten[i+] += (ten[i]%d)*;
ten[i] /= d;
}
save[cnt++] = ten[len]/;
ten[len]=;
while(tcnt<len&&ten[tcnt]==) tcnt++;
}
/*
for(int i=0;i<cnt;i++)
printf("%d ",save[i]);
printf("\n");
*/
} /*对于x=r0(mod m0)
x=r1(mod m1)
...
x=rn(mod mn)
输入数组m和数组r,返回[0,[m0,m1,...,mn]-1] 范围内满足以上等式的x0。
x的所有解为:x0+z*[m0,m1,...mn](z为整数)
*/
long long cal_axb(long long a,long long b,long long mod)
{
//防乘法溢出
long long sum=;
while(b)
{
if(b&) sum=(sum+a)%mod;
b>>=;
a=(a+a)%mod;
}
return sum;
} //ax + by = gcd(a,b)
//传入固定值a,b.放回 d=gcd(a,b), x , y
void extendgcd(long long a,long long b,long long &d,long long &x,long long &y)
{
if(b==){d=a;x=;y=;return;}
extendgcd(b,a%b,d,y,x);
y -= x*(a/b);
} long long Multi_ModX(long long m[],long long r[],int n)
{
long long m0,r0;
m0=m[]; r0=r[];
for(int i=;i<n;i++)
{
long long m1=m[i],r1=r[i];
long long k0,k1;
long long tmpd;
extendgcd(m0,m1,tmpd,k0,k1);
if( (r1 - r0)%tmpd!= ) return -;
k0 *= (r1-r0)/tmpd;
m1 *= m0/tmpd;
r0 = ( cal_axb(k0,m0,m1)+r0)%m1;
m0=m1;
}
return (r0%m0+m0)%m0;
} int main(int argc, const char * argv[]) {
int d;
while(cin>>d)
{
if(d==-) break;
for(int i=;i<d;i++) cin>>a[i];
for(int i=;i<d;i++) cin>>b[i];
scanf("%s",strm);
scanf("%s",strk);
int len = strlen(strm);
for(int i=;i<len;i++)
m[i] = strm[i]-'';
Tentod(m,len,cntm,d,savem);
len = strlen(strk);
for(int i=;i<len;i++)
k[i] = strk[i]-'';
Tentod(k, len, cntk, d, savek);
// 这样就得到了。a,b。。。
// 然后构建同模方程
if(cntm != cntk)
{
printf("NO\n");
}
else
{
int flag=;
long long m[],r[];
for(int i=;i<cntm-;i++)
{
int a1=savem[i],a2=savek[i];
int tm=;
int ta=a1;
while(b[ta]!=a1)
{
tm++;
ta=b[ta];
}
ta=a1;
int tr=;
while(ta != a2)
{
tr++;
ta=b[ta];
if(ta==a1)
{
flag=;
break;
}
}
m[i]=tm;
r[i]=tr;
if(flag==) break;
}//这里面都是b
int a1=savem[cntm-],a2=savek[cntm-];
int tm=;
int ta=a1;
while(a[ta]!=a1)
{
tm++;
ta=a[ta];
}
ta=a1;
int tr=;
while(ta != a2)
{
tr++;
ta=a[ta];
if(ta==a1)
{
flag=;
break;
}
}
m[cntm-]=tm;
r[cntm-]=tr;
if(flag == )
{
printf("NO\n");
}
else
{
long long ans=Multi_ModX(m, r,cntm);
if(ans==-) printf("NO\n");
else cout<<ans<<endl;
}
}
}
return ;
}

poj3708(公式化简+大数进制装换+线性同余方程组)的更多相关文章

  1. poj3708:函数式化简+高精度进制转换+同余方程组

    题目大意 给定一个函数 找出满足条件   等于 k 的最小的x m,k,d已知 其中 m,k 很大需要使用高精度存储 思路: 对 函数f(m)进行化简 ,令t=ceil( log(d,m) ) 可以得 ...

  2. POJ1220(大数进制转换)

    NUMBER BASE CONVERSION Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4652   Accepted: ...

  3. 洛谷p1017 进制转换(2000noip提高组)

    洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...

  4. 洛谷 1017 进制转换 (NOIp2000提高组T1)

    [题解] 纯模拟题. 我们都知道十进制数化成m进制数可以用短除法,即除m取余.逆序排列.而m进制数化为十进制数,按权展开求和即可. 但在本题中进制的基数R可能为负数,我们知道a%R的符号与R一致,也就 ...

  5. 大数进制转换 poj1220

    普通的做法,大数除小数. 复杂度o( log(n)*log(n) ),其实就是位数的平方. NUMBER BASE CONVERSION Time Limit: 1000MS   Memory Lim ...

  6. hdu-1877(大数+进制转换)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1877 思路:注意考虑0,0的情况. #include<iostream> #include ...

  7. 1030 大数进制转换(51Nod + JAVA)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1030 题目: 代码实现如下: import java.mat ...

  8. delphi -- 进制转换 函数表

    1.16 TO 10 ******************************************************** 16转10,否则输出-1 function Hex(c: cha ...

  9. java中的进制转换方法

    java中进行二进制,八进制,十六进制,十进制间进行相互转换 关键字: java 进制转换 十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer ...

随机推荐

  1. 使用PHPEXCEL导入数据到数据库

    导出功能参考:http://www.cnblogs.com/zhouqi666/p/5978017.html 比较严重的问题:当遇到excel数据量比较大的时候,会发生内存溢出的情况,目前无法解决 e ...

  2. codeforces559A--Gerald&#39;s Hexagon(计算几何)

    A. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. QQ-weiyun(微云)-云储存

    ylbtech-DatabaseDesgin:QQ-weiyun(微云)-云储存 1.A,数据库关系图(Database Diagram) -- =========================== ...

  4. osg节点统计方法(点数 面数) 【转】

    void statusNode(osg::ref_ptr<osg::Node> node,int& verNum,int& faceNum){ osg::ref_ptr&l ...

  5. Spring随笔之ApplicationContext

    前言 以前自己学习和实习的时候多次用过spring框架.对于我这种菜鸟来说,Spring给我的第一印象是好学,太TM好学了(抱歉没忍住脏话),跟着开发组熟悉几天就可以开始写代码,自我感觉代码敲得飞起~ ...

  6. thrift.transport.TTransport.TTransportException: Could not start SASL: Error in sasl_client_start (-4) SASL(-4): no mechanism available: No worthy mechs found

    thrift.transport.TTransport.TTransportException: Could not start SASL: Error in sasl_client_start (- ...

  7. git学习资料及心得

    1. 阮一峰的(简单易懂,实用性佳) http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html http://www.ruanyifeng ...

  8. v-if 条件渲染分组

    因为 v-if 是一个指令,所以必须将它添加到一个元素上.但是如果想切换多个元素呢?此时可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v-if.最终的渲染结果将 ...

  9. Oracle 时间 MM-dd形式转换

    SELECT TO_CHAR( SYSDATE,'MM-dd') AS beginTime,TO_CHAR( TO_DATE(MAX(C.SUBSCRIBE_DATE),'YYYY-MM-dd'),' ...

  10. 数据存储之iOS断点续传

    iOS里面实现断点续传 第三方框架之AFN 代码实现 一.iOS里面实现断点续传 1⃣️AFN基于NSURL 1.性能和稳定性略差.针对JSON.XML.Plist和Image四种数据结构封装了各自处 ...