循环(NOIP2005普及组第四题)

2024-02-05 10:48
文章标签 普及 循环 第四 noip2005

本文主要是介绍循环(NOIP2005普及组第四题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

循环(circle.pas/circle.in/circle.out)

(NOIP2005普及组T4)
(LYOI20090321信息学综合模拟Problem2)

问题描述
乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。
众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:
2 2486 4
3 3971 4
4 46 2
5 5 1
6 6 1
7 7931 4
8 8426 4
9 91 2
这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?
注意:
1. 如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。
2. 如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a + L次幂的最后k位都相同。

样例输入
32 2
样例输出
4
数据规模
对于30%的数据,k <= 4;
对于全部的数据,k <= 100
思路:
这个题我之前是在OJ上做过的,也知道这是NOIP题目,但是一直是0分没有AC。今天终于AC啦。下面讲讲思路:
一开始我的思路就已经有点沾正解的边了,一开始我是认为对于最终的结果SOLVE(N,K),这个数一定是N的最后一位的循环节的倍数,比如说:SOLVE(1234567,7)一定是7的循环节,也就是4的倍数。然后就可以每1234567^4进行一次乘法,不考虑精度的话,本以为这样就能得出30%的答案了,但是只得了2个点。
这里我们记X的循环节为FUNC(X),经过半个下午的思考,发现其实自己只需要把刚才的思路再拓展一下就好了。
比如说以SOLVE(223,3)为例,此时T=FUNC(3)=4模拟一下就是
223^1≡223(mod 1000)
223^2≡729(mod 1000)
223^3≡567(mod 1000)
223^4≡441(mod 1000)
先让它的倍增单位变为[223^FUNC(3)]%(10^3)=441,也就是每次都乘上441,然后就能保证个位每次都是3,记录循环节4,解释一下就是:
223*(441^1)≡343(mod 1000)
223*(441^2)≡263(mod 1000)
223*(441^3)≡983(mod 1000)
223*(441^4)≡503(mod 1000)
223*(441^5)≡823(mod 1000)
这个时候发现,223的十位为2,823的十位也为2,这样每次倍增单位就变成了(441^5)mod 1000=201,然后就能保证十位每次都是2,个位每次都是3。记录循环4*5=20
223*(201^1)≡823(mod 1000)
223*(201^2)≡423(mod 1000)
223*(201^3)≡023(mod 1000)
223*(201^4)≡623(mod 1000)
223*(201^5)≡223(mod 1000)
这个时候发现,223的百位为2,求出的223的百位也为2,这时得到的数已经到了K位了。然后就能保证百位每次都是2,十位每次都是2,个位每次都是3。记录循环4*5*5=100。
然后输出即可。
通过模拟可能思路就比较明晰了。
过程中要用到一个高精乘高精和一个高精乘低精,然后个人认为没必要为了省这点时间去打长长的高精度快速幂。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<set>
using namespace std;
int a[201],k,i,j,t[201];
int shl[10]={1,1,4,4,2,1,1,4,4,2};
string s;
int last[201];
int n[201],ans[201],aans[201],now[201];
int r()
{int ans=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){ch=getchar();}while(ch>='0'&&ch<='9'){ans*=10;ans+=ch-'0';ch=getchar();}return ans*f;
}void multiply(int x[],int y[],int z[])
{int up=0;//进位 for(int ii=1;ii<=k;ii++){for(j=1;j<=k;j++){z[ii+j-1]+=(x[j]*y[ii]+up)%10;up=(x[j]*y[ii]+up)/10;}up=0;}for(int ii=1;ii<=k;ii++){z[ii+1]+=z[ii]/10;z[ii]%=10;}
}void multiply1(int x[],int yy,int z[])
{int up=0;//进位 for(int ii=1;ii<=k;ii++){z[ii]=(x[ii]*yy+up)%10;up=(x[ii]*yy+up)/10;}
}int main()
{
//  freopen("circle.in","r",stdin);
//  freopen("circle.out","w",stdout);cin>>s;k=r();int temp=0,len=s.size();for(i=len-1;i>=len-k;i--)n[++temp]=s[i]-'0';for(i=1;i<=k;i++)ans[i]=n[i];for(i=1;i<shl[n[1]];i++){memset(aans,0,sizeof(aans));multiply(ans,n,aans);for(j=1;j<=k;j++){ans[j]=aans[j];}}t[1]=shl[n[1]];for(j=1;j<=k;j++)now[j]=ans[j];int pos=2;while(pos<=k){for(j=1;j<=k;j++)ans[j]=n[j],last[j]=now[j];temp=0;while(temp<11){temp++;memset(aans,0,sizeof(aans));multiply(ans,now,aans);for(j=1;j<=k;j++)ans[j]=aans[j];if(ans[pos]==n[pos])break;memset(aans,0,sizeof(aans));multiply(last,now,aans);for(j=1;j<=k;j++)last[j]=aans[j];}if(temp>=11){cout<<-1;return 0;}for(j=1;j<=k;j++)now[j]=last[j];memset(aans,0,sizeof(aans));multiply1(t,temp,aans);for(j=1;j<=100;j++)t[j]=aans[j];pos++;}int kk=0;for(i=100;i>=1;i--){if(t[i])kk=1;if(kk)cout<<t[i];}return 0;
}

这里写图片描述

这篇关于循环(NOIP2005普及组第四题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680668

相关文章

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

JAVA中while循环的使用与注意事项

《JAVA中while循环的使用与注意事项》:本文主要介绍while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录while循环1. 什么是while循环2. while循环的语句3.while循环的适用场景以及优势4. 注意

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

校验码:奇偶校验,CRC循环冗余校验,海明校验码

文章目录 奇偶校验码CRC循环冗余校验码海明校验码 奇偶校验码 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据检验码的码距。 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 奇校验:整个校验码中1的个数为奇数 偶校验:整个校验码中1的个数为偶数 奇偶校验,可检测1位(奇数位)的错误,不可纠错。

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

Spring是如何解决循环依赖?

现象解释: 在Spring框架中,循环依赖(Circular Dependency)是指两个或多个Bean之间相互依赖,形成了一个循环。例如,Bean A依赖于Bean B,而Bean B又依赖于Bean A。Spring通过多种机制解决循环依赖问题,具体来说,主要有以下几种方式: 1.三级缓存机制 Spring容器在实例化Bean时使用了三级缓存来解决循环依赖,主要涉及三个缓存结构: 一级