トピックリンクhttp://acm.hdu.edu.cn/showproblem.php?pid=4810
問題解決のアイデア:
各数の個々のビットや質問の意味に従ってレコード番号1、生成する排他的論理和値は、このような三人の1 1 6内に取るような数学的方法の組み合わせによって、ベース1を取る必要があり、取得方法は、C(6,3)を持って、あなたはすぐにそれは、C(6,3)を取得できますか?三角形でテーブルを再生することができます
#include <iostreamの> する#include <cstdioを> する#include <CStringの> 使用して 名前空間STD; の#define P 1000003 INT N-、C [ 1005 ] [ 1005 ]、SUM [ 40 ]、A、ANS [ 1005 ]、T; // C [] []三角形記録
// SUM []数1はそれぞれに記録されている;
// ANS [] k個のレコード日数の実施形態 INT メイン() {
//三角形プレイテーブル、レコードC( M、N-) のための(INT I = 0 ; I <= 1000年 ; I ++ ) { C [I] [ 0 ] = 1 ; C [i]は[I](合計))。= 1 ; } ため(INT iが= 1 ; I <= 1000年 ; I ++ ) { ため(INT J = 1、J <I、J ++ ) { C [I] [J] =(C [iが- 1 ] [J]%のP + C [I- 1 ] [J- 1 ]%P)%のP。 } } ながら(〜のscanf(" %d個"、&N)) { memsetの(和、0、はsizeof のmemset(ANS、0、はsizeof (ANS));
//レコードごとになります何 のために(INT I = 0、I <N - 、I ++ ) { int型T; scanfの(" %のD "、&T) ; のための(INT J = 0 ; T J ++、T = >> 1。 ) { IF(%T 2)SUM [J] ++ ; //ビット1; } } のための(int型 K = 1。 ; K <= N; K ++ ) { 以下のために(int型私は= 0を。I < 32 ; I ++ ) { ため(INT J = 1 ; J <=和[I] && J <= K; J + = 2 ){ T =(長い 長い)C [和[I]、[J] * C [N-和[I] [KJ]%P *(1 << I)%のP。 ANS [K] =(ANS [K] + T)%のP。 } } } のための(int型のk = 1 ; K <= N; K ++ ) のprintf("%D%Cは"、[k]をANS、K <N?' ':' \ n ' ); } }