程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 5212(容斥原理)

hdu 5212(容斥原理)

編輯:C++入門知識

hdu 5212(容斥原理)


 

Code

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 77 Accepted Submission(s): 27



Problem Description WLD likes playing with codes.One day he is writing a function.Howerver,his computer breaks down because the function is too powerful.He is very sad.Can you help him?

The function:


int calc
{

int res=0;

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

{

res+=gcd(a[i],a[j])*(gcd(a[i],a[j])-1);

res%=10007;

}

return res;

}
Input There are Multiple Cases.(At MOST 10)

For each case:

The first line contains an integer N(1≤N≤10000).

The next line contains N integers a1,a2,...,aN(1≤ai≤10000).

Output For each case:

Print an integer,denoting what the function returns.
Sample Input
5
1 3 4 2 4

Sample Output
64

Hintgcd(x,y) means the greatest common divisor of x and y. 

Source BestCoder Round #39 ($)
Recommend hujie | We have carefully selected several similar problems for you: 5213 5209 5208 5205 5204

 

 

給你一個a數組,讓你計算那段代碼的結果,用容斥原理就ok,莫比烏斯反演也行,不過不會莫比烏斯反演(也是容斥原理)orz。。。改天學習下。

代碼如下:

 

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 1e4 + 10;
const ll mod = 10007;
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define pb push_back
int cnt[maxn],a[maxn];
ll d[maxn];
int main()
{
        int n;
        while(~scanf("%d",&n)) {
            int Mgcd = 1;
            for(int i = 0; i < n; i++) {
                int x;
                scanf("%d",&x);
                Mgcd = max(Mgcd,x);
                a[i] = x;
            }
            memset(cnt,0,sizeof(cnt[0])*Mgcd+20);
            for(int i = 0; i < n; i++)cnt[a[i]]++;
            ll ans = 0,res = 0;
            /*d[i]表示任取兩數gcd為i的方案數*/
            for(ll i = Mgcd; i > 0; i--) {
                ll tot = 0;
                for(ll j = i; j <= Mgcd; j+= i)
                {
                    tot += cnt[j];
                    d[i] = (d[i]-d[j])%mod;/*減去gcd為i的倍數的方案數(容斥原理)*/
                }
                /*gcd為i的方法數等於任選兩個數(可重)是i的倍數的方案
                除去gcd為i的倍數的情況(前面已經減掉了)*/
                d[i] = (d[i] + tot*tot)%mod;
                ans = (d[i]*i*i)%mod;
                res = (res+i*d[i])%mod;
            }
            cout<<((ans-res)%mod+mod)%mod<

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved