割り切れる判決

説明] [タイトル
正の整数の所定の配列の、+又は各番号の前に挿入されている-それらの数および計算。例えば、配列:1,2,4、8つの可能なシーケンスがあります。

(1)+(2)+(+4)= 7
(1)+(2)+(-4)= -1
(+1)+(-2)+(+4)= 3
( +1)+(-2)+(-4)= -5
(-1)+(2)+(+4)= 5
(-1)+(2)+(-4)= -3
( -1)+(-2)+(+4)= 1
(-1)+(-2)+(-4)= -7
Kの少なくとも一つですべての結果が整数分割することができ、我々は、正の整数この呼ば配列がkで割り切れるであってもよいです。例えば、上記のシーケンスが分割してもよい3,5,7、2,4,6,8 ......分割することができません。注:0、-3、-6、-9 ...... 3の倍数であると考えることができます。

[入力]
N(2 <N <10000:入力の最初の行は二つの数字含有 ) 、及びK(2 <K <100) 、 Nは被除数の総数N、k個の代表を表します。二行目は、N個の整数の配列を提供し、(おそらく繰り返し)10000から0までの範囲の整数です。

[出力]
正の整数kのシーケンスが分割してもよい場合は、出力YES、そうでなければ出力することはできません。(注:すべて大文字)

[サンプル]入力
3 2
1 2 4。
[出力]サンプル
NO
タイトル分析:
最も重要な問題は理解されるべきである([N] [1] + [2] + ...)%K =(([ 1] + [2] + ... [N-1])は、%K + [N]%K)%kである。 あなたが理解できない場合は、研究数論の基礎合同定理に行ってきました、この問題は確かに助けを理解するだろう。
我々はFを使用する前に、それ以外のときは0〜1の値があれば、[I]は[j]はiが、ダイの数とjのk値を表し、
したがって、我々は知っている[1] [1、F組の初期条件】%K] = 1;それはの値を表す[1]%のK型の最初の数字の後に、私たちは1の値が存在することを示し、それを与えるK。
次の我々は数前に問題の規模に拡張N、数nおよびjのkは、Fのように表すことができるかどうかを上金型後に元の値[n]は[J] = F [N-1] [(J + [N-1]% K)%K] 請求J + [N-1] %K)%K =(([1] + [2] + ... + [N-2])% K + [N-1] %K)%K =([1] + [2] + ... + [N-1])%K。
しかし、彼は、シンボルを追加することができる質問の意味は、式それはF [i]は[J] =なる +(F [I-1]を[(J + [I]%K)%K] || F [I-1] [(JA [I]%K K)%のK])。(ここで、(JA [I]%のK + K)%K 配列境界を防ぐため)。
コード:

#include<iostream>
#include<cmath>
using namespace std;
int a[10001],f[10001][101];
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    f[1][a[1]%k]=1;
    for(int i=2;i<=n;i++)
        for(int j=0;j<k;j++)
        f[i][j]=(f[i-1][(j+a[i]%k)%k]||f[i-1][(j-a[i]%k+k)%k]);
    if(f[n][0])
        cout<<"YES";
    else cout<<"NO";
    return 0;
}
リリース3元の記事 ウォンの賞賛1 ビュー93

おすすめ

転載: blog.csdn.net/amazingee/article/details/104044848