合同定理 - 理解することは簡単で、使用

問題のオーバーフローを防止し、いくつかの特別な役割を持っている合同、ブロガーは、単に以上のシェアを持つ単純なアプリケーションのために、深くない学びます。(乗算記号の中には、私がプレーしていないではありません記事のレイアウトまで乗算記号の意志の混乱で、ブログの欠陥)
の数式に名前を付ける
:数式を証明するために、その前に、%N = Bの%nは、Aを言うなら合同およびbは、(AB)%n = 0です。すなわち、n個のABの整数倍ですなぜ?
あなたが考える、%N = 0の場合、(+ N%を= / N)、/ 任意の数の部分Iと整数倍の部分に取り込むことができることは、数割り切れるが続きます。
その後、%N + A1N(= a1は整数である)、B = B%N + B1N(b1は整数である)でBA、同じ残り、最終的には(B1-A1)を取るN、A1を 、B1は整数でありますしたがってB1-A1実際には任意の整数、(B1-A1)を取るN Nの倍数であることができ、それは、N BAの倍数です。
実際には、既に(%N + A1Nを=前記 A1は、 実際に出て証明された整数です)。将来は直接使用することができるように、合同との数はB = A + TNの数(tは任意の整数であり、nは合同の数である)、当然のことながら、この結論は、十分かつ必要であることである場合、使用に対抗することができます。
当然の結果、以下のいくつかのリリース
1:(+ b)は%
N =((%のN)+(B%N))%N; A、Bおよびアリコート部分に分け逆合同定理、残りの部分を取りますで、%N =(TN-見出さ )%nを。もちろん、あなたが+ bの、+ B +への変更であってもよいこと、無料の代替数学的な原則があり ... C、AB あなたは、全体として、どのように変更することができるものを見てみましょう、と(%n)が+(Bの%n)は、N +(/ N)A-と等価ではない B-(B / N)= A + B-(/ N + B / N)= A + B-TN。(/数割り切れる、+ bは全体の外観です)
2:もちろん、あなたもまだ少し問題を抱えている、実際に上記の証拠を見つけることができ、また、負の権利をすることができることを、私はいくつかの単語を言わせて、上記の要件の結果はもちろん、tは否定することができ、正ですブロガーが負の剰余が信頼性の高い確率を持っていない、があるかもしれない、統計を別のマシンの実現のために見て、私は見つかっていません。しかし、我々はすべての正の数は、ああすることをお勧めします。
(AB)%N =(( %N) - (B%N)+ N)%のn - (B(%n)であるため、この式は、私がそれを証明していない、彼はそれを言っ %nは) かもしれもちろん、小さい負の負のnより、とてもプラスN。
。3:AB%N =((A N%)(%のBのN))%N
、Bはnより大きいている場合であれば、nが少ないABよりも、何もしないと同等、自然に、確立され、その後、= A1 + T1 N、T2 B = B1 + N、あるA1 * B1 + ... N乗算後の背中の倍数であり、それは直接差し引くことができます。
あるいは3上記式プラス任意原理を描くことができる:
計算するためにのみ添加整数含まれ、減算および乗算発現は、正の整数nによって分割され、nは、計算の各ステップの後に同じ結果を剰余をとることができます。
なぜそれが流出防止だけでなく、他の影響することができます。
ここでの例である:
**与えられた正の整数nおよびmは、以下の条件の正の整数(a、b)は、統計的に満足の数:

  1. 1≤a≤n、1≤b≤m。
  2. ×bが2016の倍数です。
    入力
    ではない30以上を備える入力データ・セット。
    データの各セット二つの整数は、N-含有、M(1≦N、m≤10。9)。
    出力
    データの各セットについて、条件を満足する整数で表さ出力します。
    入力サンプル
    32〜63は、
    2016 2016
    1000000000 1000000000
    出力例
    。1
    30576
    7523146895502644 **
    説明コード
#include<cstdio>
#include<cstring>
#define ll long long
ll minx(ll a,ll b){
	return a<b?a:b;
}
/*
这题看数据很可能会爆int,用long long,
看数据多少,用枚举肯定会超时。 
*/
int main()
{
	ll n,m,ans=0,i,j,x,y;
	/*
	我解释一下,如果a*b%2016=0
	则(a+t1*2016)*(b+t2*2016)%2016=0,你展开一下就可以发现成立。 
	为什么我上面那三个公式的证明过程写的那么详细,
	因为实际上根据那样的方法可以证明出各种不一样的公式
	但原理就那些,要学会举一反三 。 
	*/
	while((scanf("%lld %lld",&n,&m))==2)
	{
		ans=0;
		/*
		所以实际上,你求一下在1到2016之间有多少个整数对i,j满足
		相乘为2016的倍数,然后看一下对于每队满足条件的i,j这两个数分别可以加上多少个2016 。 
		即设在1到n中,有存在n个t整数值满足x=i+2016*t,
		同理求y,相乘个数。
		最终再加起来即可 
		*/
		for(i=1;i<=minx(n,2016);i++){                
			for(j=1;j<=minx(m,2016);j++){
				if((i*j)%2016==0){
					x=n/2016;
					y=m/2016;
					if(n%2016>=i)x++;     //因为整除可能有损失,比如对于i,如果n=i+1+2016k,那就有k+1个
					if(m%2016>=j)y++;     // 如果 n=i-1+2016k,那只有k个 
					ans+=x*y;
				}
			}
		}
		printf("%lld\n",ans);
	}
}
公開された14元の記事 ウォン称賛16 ビュー1283

おすすめ

転載: blog.csdn.net/weixin_45981189/article/details/105024754