• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
村雨sup
自己选的路,跪着也要走完 XD
博客园    首页    新随笔    联系   管理    订阅  订阅
中国剩余定理——nyoj

中国剩余定理------
解法如下:假设存在一个数M M%A=a , M%B=b , M%C=c
并且A,B,C必须俩俩互质。满足这一条件下:
存在一个R1使得 , K1=A*B*R1 ,K1%C==1.
存在一个R2使得 , K2=C*B*R2,K2%A==1.
存在一个R3使得 , K3=C*A*R3,K3%B==1.
则必定满足 M=(K1*c+K2*a+k3*b)%(A*B*C);
但是此题有条件10<=M<=100;
所以可以在此范围里找,有则输出,没有则输出"No answer";

1.因为这个数能被5和7整除而不能被3整除,所以肯定是5和7的倍数,也就是35k,但是我们需要保证被3除的结果是a,所以我们令k=2,这样,70k%3=1,而k=1时,35k%3=2,所以,能被5和7整除不能被3整除且余数为a的数为70a。


2.被3和7整除,不能被5整除,则为21k,k=1时,正好余1,所以这个数为21b。


3.被3和5整除,不能被7整除,则为15k,k=1时,正好余1,所以这个数为15c。


所以,这个数为70a+21b+15c,又因为3、5、7的最小公倍数为105,所以这个数肯定在0到105以内,所以对结果取余一下即可。


推广到其他情况也是同样道理。


比如,求除以5、7、11以后所得余数为a,b,c.则这个数是:231a+330b+210c,然后对5×7×11=385取余即可。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long  ll;
const int INF = 0x3f3f3f3f;
const int maxn = 2000;

int main()
{
    int a,b,c;
    while(~scanf("%d%d%d",&a,&b,&c)){
        int ans = (70*a+21*b+15*c)%105;
        if(ans <= 100&&ans >= 10)
            printf("%d\n",ans);
        else
            printf("No answer\n");
    }

    return 0;
}

——

posted on 2018-02-28 18:55  村雨sup  阅读(203)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3