题目链接:点这里!!!!
题意:求(q-1)*(q-2)%p,(1<=q<=1e18,q is primer, 1<=p<=1e18)
题解:直接俄罗斯乘法就可以了。
俄罗斯乘法:点这里!!
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<sstream> #include<algorithm> #include<vector> #include<bitset> #include<set> #include<queue> #include<stack> #include<map> #include<cstdlib> #include<cmath> #define PI 2*asin(1.0) #define LL long long #define pb push_back #define pa pair<int,int> #define clr(a,b) memset(a,b,sizeof(a)) #define lson lr<<1,l,mid #define rson lr<<1|1,mid+1,r #define bug(x) printf("%d++++++++++++++++++++%d\n",x,x) #define key_value ch[ch[root][1]][0]C:\Program Files\Git\bin const int MOD = 1000000007; const int N = 500+15; const int maxn = 60000+1000; const int letter = 130; const int INF = 1e17; const double pi=acos(-1.0); const double eps=1e-8; using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } LL p,q,x,y; LL cc(LL a,LL b){ LL ans=0,pc=a; while(b){ if(b&1){ ans=(ans+pc)%p; b--; } else { pc=(pc*2)%p; b=b/2; } } return ans; } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%I64d%I64d",&q,&p); if(q<=2) {puts("0");continue;} LL x,y; if((q-2)&1) x=q-2,y=(q-1)/2ll; else x=(q-2)/2ll,y=q-1; LL ans=cc(x,y); printf("%I64d\n",ans); } return 0; }