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;
}
posted @ 2016-04-19 13:42  霜降sma  阅读(102)  评论(0编辑  收藏  举报