您的位置:首页 > 其它

HDU 5666 Segment —— 快速加 俄罗斯农民乘法

2017-11-26 20:36 316 查看


Segment

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

Total Submission(s): 2132    Accepted Submission(s): 799


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

俄罗斯乘法,用于计算两个数直接相乘爆longlong的情况,可以在数相乘时不断取模,和快速幂类似。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#define max_ 100010
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;

ll n,m;
ll fadd(ll a,ll b)
{
ll ans=0;
while(b!=0)
{
if(b&1)
ans=(ans+a)%m;
b/=2;
a=(2*a)%m;
}
return ans%m;
}
int main(int argc, char const *argv[]) {
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
printf("%lld\n",fadd((n-1)/2%m,(n-2)%m));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: