码迷,mamicode.com
首页 > 其他好文 > 详细

【NOIP2005P】循环(于2018.2.12)

时间:2018-02-12 20:57:05      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:类型   out   post   判断   memset   ++   就是   set   正整数   

问题描述

       对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?

输入格式
  只有一行,包含两个整数n(1 <= n < 10^100)和k(1 <= k <= 100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。
 
输出格式
  包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。
 
数据规模和约定
  对于30%的数据,k <= 4;
  对于全部的数据,k <= 100。
 
解题历程:
 
先暴力切掉30分
 
大致是维护一个k位字符串不断乘上一个int型,
出现与刚开始如出一辙的串式可以判断是出现循环了,输出;
出现了出现过的串式(刚开始的除外)就可以看出是死循,输出(-1)
【可能在数学上有更好的判断方式,但目前只能想到这样】
 
至于判重,用了字符串哈希,膜一个大素数即可。
 
就是一个高精度乘法
代码:

void check()
{
    int rest=0;
    F(i,0,k-1)
    {
        int sub=(st[i]-‘0‘)*n+rest;
        st[i]=sub%10+‘0‘;
        rest=sub/10;
    }
    return;
}

int change(string st)
{
    int x=0;
    F(i,0,k-1)
    x=(x*10+st[i]-‘0‘)%mo;
    return x;
}

void work()
{
    int cnt=0;
    while(1)
    {
        cnt++;
        check();
        if(st==ansst)
        {
            cout<<cnt<<endl;
            return;
        }    
        int num=change(st);
        if(vit[num]==1)
        {
            cout<<"-1"<<endl;
            return;
        }
        else vit[num]=1;
    }
    return ;
}
以上、
这样30分。
 
看了下数据,n远超Int 和ll 型,
就码了一个真~高精度乘法
好像还是第一次码...很坎坷
 
代码:
void check()
{
    memset(sum,0,sizeof(sum));
    int rest=0;
    int len=n.size();
    F(t,0,len-1)
    {
        rest=0;
        F(i,0,k-1-t)
        {
            int sub=(st[i]-‘0‘)*(n[t]-‘0‘)+rest;
            sum[t+i]+=sub%10;
            rest=sub/10;
        }
    }
    rest=0;
    F(i,0,k-1)
    {    
        int sub=sum[i]+rest;
        st[i]=sub%10+‘0‘;
        rest=sub/10;    
    }
    return;
}
以上、
 
写的时候主要是字符类型和整数转换出了问题
改了半天
 
可能是写的有问题,分数上没有丝毫增长......
优化解法今天头疼不想了,
下次再写。
 
以上。

【NOIP2005P】循环(于2018.2.12)

标签:类型   out   post   判断   memset   ++   就是   set   正整数   

原文地址:https://www.cnblogs.com/qswx/p/8445438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!