BestCoder Round #80 1002

HDU 5666 Segment
題意:給你條斜率爲-1,常數項爲q(q爲質數)的直線,連接原點與直線上整數格點,問你在有多少個格點在形成的無數個三角形內,而不在線段上,結果對P取模。

思路:bestcoder題解上有思路,一條以(0,0)爲起點,(x,y)爲終點的線段上格點的個數(不包含端點時),一定是gcd(x,y)−1,題目由於p爲質數,所以所有線段上都沒有格點,需要注意的是p爲質數,情況就很少了,然後就是數據太大的問題,改一改快速冪就可以了。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 100005;
long long p,q;
long long sum;
long long powf(long long a, long long b)
{
    long long r = 0, base = a;
    while(b)
    {
        if(b&1)
            r = (r + base) % q;
        base = (base + base) % q;
        b >>= 1;
    }
    return r;
}
int main()
{
    int t;
    cin >> t;
    while(t--){
        cin >> p >> q;
        if(p&1) sum = powf(p/2, p-2);
        else sum = powf(p/2-1, p-1);
        cout << sum << endl;
    }
    return 0;
}
發佈了34 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章