程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> BZOJ 3823 定情信物 線性篩乘法逆元

BZOJ 3823 定情信物 線性篩乘法逆元

編輯:C++入門知識

BZOJ 3823 定情信物 線性篩乘法逆元


題目大意:n維多面體中有多少n-1維,n-2維,n-3維。。。1維元素,求他們的異或和並%p。


思路:考試題,當時做的時候不會線性篩乘法逆元,就得了70分。。。

算法和標程不太一樣,標程好象是遞推,但是我空間想象力不夠,沒推出來。。只能找規律了。。花了一個半小時才找出來的規律。。


CODE:

#include 
#include 
#include 
#include 
#define MAX 10000000
using namespace std;
 
long long n,p;
long long ans,temp = 1;
long long inv[MAX];
int power[MAX];
 
void Shake()
{
    inv[1] = 1;
    for(int i = 2; i <= n; ++i)
        inv[i] = (p - p / i) * inv[p % i] % p;
}
 
int main()
{
    cin >> n >> p;
    power[0] = 1;
    for(int i = 1; i <= n; ++i)
        power[i] = (power[i - 1] * 2) % p;
    Shake();
    ans = power[n];
    for(int i = 1; i <= n; ++i) {
        temp = (temp * (n - i + 1)) % p;
        temp = (temp * inv[i]) % p;
        ans ^= (temp * power[n - i] % p);
    }
    cout << ans << endl;
    return 0;
}


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