zoukankan      html  css  js  c++  java
  • UVA-10710 Skyscraper Floors (找规律+幂取模)

    题目大意:题目中给了一种数的定义,根据定义,让判断一个给定的数是不是这种数。题中叫这种数为吉米数,定义如下:对序列1,2,3,,,,n,做n-1次SF变换(对该变换的解释在下文),如果能得到原序列,则n为吉米数。

    SF变换:若n为偶数,以n=10为例,一次SF变换是这样的

        1,2,3,4,5,6,7,8,9,10—>1,2,3,4,5  6,7,8,9,10—>6,1,7,2,8,3,9,4,10,5  此为偶数的一次SF变换,第二次变换是基于新序列的,以此类推。

        若n为奇数,以n=9为例,一次SF变换是这样的

        1,2,3,4,5,6,7,8,9—>1,2,3,4  5,6,7,8,9—>5,1,6,2,7,3,8,4,9   此为奇数的一次SF变换,第二次变换也是基于新序列的,以此类推。

    题目分析:根据题中的提示,偶数不是吉米数。如果是吉米数,则相应的序列中的任一元素的位置周期都是一样的,所以只需考虑1。最终找到1的位置有如下规律:pos=(2^t)%n,其中t为变换的次数。所以只需判断(2^(n-1))%n=1是否成立即可。

     实际上还是幂取模!!!

    代码如下:

     1 # include<iostream>
     2 # include<cstdio>
     3 # include<cstring>
     4 # include<algorithm>
     5 using namespace std;
     6 # define ll long long
     7 ll mypow(ll a,ll b,ll m)
     8 {
     9     if(b==0)
    10         return 1;
    11     if(b==1)
    12         return a%m;
    13     ll u=mypow(a,b/2,m);
    14     u*=u;
    15     u%=m;
    16     if(b&1)
    17         u*=a;
    18     return u%m;
    19 }
    20 bool is(ll x)
    21 {
    22     ll pos=mypow(2,x-1,x);
    23     return pos==1;
    24 }
    25 int main()
    26 {
    27     ll n;
    28     while(scanf("%lld",&n)&&n!=-1){
    29         if(is(n))
    30             printf("%lld is a Jimmy-number
    ",n);
    31         else
    32             printf("%lld is not a Jimmy-number
    ",n);
    33     }
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4709409.html
Copyright © 2011-2022 走看看