USACO:Your Ride is here

#include <stdio.h>
long Calculate(char name[]);


int main()
{
    char CometName[10], GroupName[10];
    freopen("ride.in", "r", stdin);
    freopen("ride.out", "w", stdout);
    scanf("%s", CometName);
    scanf("%s", GroupName);
    if((Calculate(CometName) % 47) == (Calculate(GroupName) %47))
                             printf("GO\n");
    else                     printf("STAY\n");
    fclose(stdin);
    fclose(stdout);
    return 0;
}


long Calculate(char name[])
{
     int i;
     long res=1;
     for(i=0; name[i]!='\0'; ++i)
     {
              res*=(name[i]-'A'+1);
     }
     return res;

}


4. 模运算规则, 模运算与基本四则运算有些相似,但是除法例外。其规则如下
   (a + b) % n = (a % n + b % n) % n            (1)
   (a - b) % n = (a % n - b % n) % n            (2) 
   (a * b) % n = (a % n * b % n) % n            (3)
    a% n = ((a % n)b) % n                      (4)

(1)式证明
∵ a = k1*n + r1

   b = k2*n + r2

  a % n = r1

  b % n = r2

∴(a+b) % n = ((k1+k2)*n + (r1+r2)) % n = (r1+r2) % n = (a % n + b % n)% n
    得证
(2)式证明同上
(3)式证明
     a = k1*n + r1
     b = k2*n + r2
     (a*b) % n = (k1k2n2 + (k1r2+k2r1)n + r1r2) % n = r1r2 % n = (a %n * b %n ) % n
 (4)式证明
      设 a % n = r
      a%n= (a * a * a * a…*a) %n = (a %n * a %n * a %n * … * a %n) %n = rb % n = ((a % n) b) % n
  
模运算看起来不是很直观,但是可以用来推导出一些有用的东西。 例如(4)式可以用来降幂运算,例如计算6265 % 133,直接计算的话需要算出6265 利用(4)式可以进行降幂运算。
  6265 % 133
  = 62 * 6264 % 133
  = 62 * (622)32 % 133
  = 62 * 384432 % 133
  = 62 * (3844 % 133)32 % 133
  = 62 * 12032 % 133

  = 62 * 3616 % 133
  = 62 * 998 % 133
  = 62 * 924 % 133
  = 62 * 852 % 133
  = 62 * 43 % 133
  = 2666 % 133
  = 6

----摘自 http://www.cnblogs.com/jojoke/archive/2007/12/17/1003594.html


所以修改版本为

#include <stdio.h>
long Calculate(char name[]);


int main()
{
    char CometName[10], GroupName[10];
    freopen("ride.in", "r", stdin);
    freopen("ride.out", "w", stdout);
    scanf("%s", CometName);
    scanf("%s", GroupName);
    if(Calculate(CometName) == Calculate(GroupName))
                             printf("GO\n");
    else                     printf("STAY\n");
    fclose(stdin);
    fclose(stdout);
    return 0;
}


long Calculate(char name[])
{
     int i;
     long res=1;
     for(i=0; name[i]!='\0'; ++i)
     {
              res*=((name[i]-'A'+1) % 47);
     }
     return res % 47;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值