您的位置:首页 > 其它

HDU 5666 Segment (大数乘法取模)

2017-03-08 20:05 337 查看


Segment

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 1765    Accepted Submission(s): 651


Problem Description

    Silen
August does not like to talk with others.She like to find some interesting problems.

    Today
she finds an interesting problem.She finds a segment x+y=q.The
segment intersect the axis and produce a delta.She links some line between (0,0)and
the node on the segment whose coordinate are integers.

    Please
calculate how many nodes are in the delta and not on the segments,output answer mod P.

 

Input

    First
line has a number,T,means testcase number.

    Then,each
line has two integers q,P.

    q is
a prime number,and 2≤q≤1018,1≤P≤1018,1≤T≤10.

 

Output

    Output
1 number to each testcase,answer mod P.

 

Sample Input

1
2 107

 

Sample Output

0

 

Source

BestCoder Round #80

 

Recommend

wange2014   |   We have carefully selected several similar problems for you:  6018 6017 6016 6015 6014 

别人说是利用二进制,感觉并不是,其实就是相当于把b分解成n个2相乘,这样每次a*2取模,如果b为奇数,最后再加上一个b,.这样就OK了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
__int64 p,q;
void solve(__int64 a, __int64 b)
{
__int64 s=0, base=a;
while(b)
{
if(b&1)
{
s+=base;
s%=p;
b--;
}
else
{
base*=2;
base%=p;
b=(b>>1);
}
}
printf("%I64d\n", s);
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%I64d%I64d", &q, &p);
if(q==2)
{
printf("0\n");
}
else
{
__int64 x=(q-1)/2%p;
__int64 y=(q-2)%p;
solve(x, y);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: