【2015ZUFE新生赛网络同步赛D】【暴力 时间戳】会长爱数学 数字十进制临位乘法循环节长度

来源:互联网 发布:js 特效的网站 编辑:程序博客网 时间:2024/04/28 20:32
#include<stdio.h>#include<iostream>#include<string.h>#include<string>#include<ctype.h>#include<math.h>#include<set>#include<map>#include<vector>#include<queue>#include<bitset>#include<algorithm>#include<time.h>using namespace std;void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}#define MS(x,y) memset(x,y,sizeof(x))#define MC(x,y) memcpy(x,y,sizeof(x))#define MP(x,y) make_pair(x,y)#define ls o<<1#define rs o<<1|1typedef long long LL;typedef unsigned long long UL;typedef unsigned int UI;template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}const int N=1e6+10,M=0,Z=1e9+7,ms63=1061109567;int casenum,casei;int n;int E[N],e[N];int TIM,tim;int a[10];int cal(int x){int p=0;while(x){a[++p]=x%10;x/=10;}int tmp=a[p]*a[1];for(int i=1;i<p;++i)tmp+=a[i]*a[i+1];return tmp;}int solve(int n){E[n]=++TIM;e[n]=0;tim=0;while(1){n=cal(n);if(E[n]!=TIM){E[n]=TIM;e[n]=++tim;}else return tim+1-e[n];}}int main(){while(~scanf("%d",&n)){printf("%d\n",solve(n));}return 0;}/*【trick&&吐槽】大力出奇迹!【题意】给你一个数x(0<=x<=1e6),让你不断地使得x=f(x),直到出现循环节。问你最后出现的循环节的长度。f(x)定义为,对于x,做10进制分解,得到n位。然后f(x)就是p1*p2+p2*p3+...+pn*p1。特别的,如果n==1,那么f(x)也仍然是p1*p1+p1*p1。【类型】暴力,时间戳【分析】因为,对于x的极限999999,f(x)也只不过是9*9*6只有81*6,数据下降得极快。于是我们直接暴力,打上时间戳,记录步数,就可以找到循环节,然后AC这道题啦!PS:这题可以加双重时间戳来加速哦!*/

0 0
原创粉丝点击