NOIP2013 提高组 复赛 day1 circle 转圈游戏

来源:互联网 发布:淘宝网店代销 编辑:程序博客网 时间:2024/05/22 03:19

NOIP2013 提高组 复赛 day1 circle 转圈游戏

1.题目读下来,惊呆了,这可是第一题啊。

2.进行模拟,弄明白了题意。

3.看了数据范围,好吧,本题第一目标30分。

4.开始编程,定了目标后,就比较简单了。

5.样例通过,第一次提交,得分0,原因:new_x=(x+m)%n;//此处new_x=x+m;得分0

6.马上进行修改,第二次提交,得分30,满意了。

30分的目标,此题耗时:10分钟即可。从整个考试来说,还是很划算的。

7.做题的时候感觉本题要用初等数论的取余的一些性质,目前还达不到这个水平。

8.有个疑问,提交时,是否能知道成绩,是否能提交多次,若能,是否要罚分。

9.突然想到,每次*10就取一次余,应该可以得到更多的分。提交,得分80,非常满意。

80分的目标,应该是编完其它程序再回过来做。

耗时:30分钟

10.剩下的20分,坚决不看解答,等能力到了,再回来做。要靠自己做出。

11.将80分代码中int 改成long long,得分90.

12.接下来,分数再也提不上了,搜索网络,发现---快速幂,看来不学新的东西,就无法AC。

13.好吧,坐下来,学学快速幂。

14.http://wenku.baidu.com/link?url=Cyhe-A3PtI8YD9xgNW3ss7kBQzQ3nGtUVZojX_QkRRonq3y7du4k3zsrpg7mfKqcqqM5UhiRqOQfaU-PXwwGtY60uichOq9y_F1HakD54Da文章写得不错,也就是为什么要用快速幂,分析得很透彻。

15.用快速幂编码,提交AC。

2017-1-24 22:01

16.快速幂的最大特点是算法时间复杂度从通常的o(n)降为o(logn),此类题型的最大问题,就是超时,TLE(Time Limit Exceeded)。

附上AC代码,编译环境Dev-C++4.9.9.2

//2013 circle2
//2013 circle
#include <stdio.h>
int main(){
    long long n,m,k,x,new_x;
    long long i;
    long long circle=1;
    long long a;
    scanf("%lld%lld%lld%lld",&n,&m,&k,&x);
    a=10;
    a=a%n;
    while(k>0){
        if(k%2==1)
            circle=(circle*a)%n;
        k/=2;
        a=(a*a)%n;
    }
    m=(m*circle)%n;
    new_x=(x+m)%n;//此处new_x=x+m;得分0 ,修改后,得分30
    printf("%lld\n",new_x);
    return 0;
}


附上90分代码,编译环境Dev-C++4.9.9.2

//2013 circle2
//2013 circle
#include <stdio.h>
int main(){
    long long n,m,k,x,new_x;
    int i;
    long long circle=1;
    scanf("%lld%lld%lld%lld",&n,&m,&k,&x);
    for(i=1;i<=k;i++){
        circle*=10;
        circle%=n;//每次取余
    }
    m=(m*circle)%n;
    new_x=(x+m)%n;//此处new_x=x+m;得分0 ,修改后,得分30
    printf("%lld\n",new_x);
    return 0;
}


附上80分代码,编译环境Dev-C++4.9.9.2

//2013 circle
#include <stdio.h>
int main(){
    int n,m,k,x,new_x;
    int i;
    int circle=1;
    scanf("%d%d%d%d",&n,&m,&k,&x);
    for(i=1;i<=k;i++){
        circle*=10;
        circle%=n;//每次取余
    }
    m=(m*circle)%n;
    new_x=(x+m)%n;//此处new_x=x+m;得分0 ,修改后,得分30
    printf("%d\n",new_x);
    return 0;
}


附上30分代码,编译环境Dev-C++4.9.9.2

//2013 circle
#include <stdio.h>
int main(){
    int n,m,k,x,new_x;
    int i;
    int circle=1;
    scanf("%d%d%d%d",&n,&m,&k,&x);
    for(i=1;i<=k;i++)
        circle*=10;
    circle%=n;
    m=(m*circle)%n;
    new_x=(x+m)%n;//此处new_x=x+m;得分0 ,修改后,得分30
    printf("%d\n",new_x);
    return 0;
}


0 0