2015 ACM/ICPC Asia Regional Shanghai Online --HDU 5478

一道数学题里面的水题—-快速幂+数学推理
然而也是看了别人的想法才A掉的。为以后的这类型的题提供一个思路:
a^(k1⋅n+b1) + b^(k2⋅n−k2+1)=0 (%c)
n=1时
a^(k1+b1) + b =0 (%c)————————-①
n=2时
a^(k1⋅2+b1) + b^(k2+1)=0 (%c)—————②
因为%c=0,那么乘上一个数也是成立的
①乘 a^(k1)
得:a^(k1*2+b1) +a^(k1)* b =0 (%c) 与②对比
<=> a^(k1)* b =b^(k2+1)
<=> a^(k1)=b^k2———————————③

所以根据① 和③
a 从1-c 扫一遍用快速幂算出a^(k1+b1) ,从而可知道每一个a^(k1+b1) 对应的b值,
若是b 又满足 ③式 可知 a,b满足条件。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define mem(a) memset(a,0,sizeof(a))
#define pfn printf("\n")
#define ll __int64
#define pfd(a) printf("%d\n",a)
#define pf2d(a,b) printf("%d %d\n",a,b)
#define pf3d(a,b,c) printf("%d %d %d\n",a,b,c)
#define pfs(a) printf("%s\n",a)
#define sfd(a) scanf("%d",&a)
#define sf2d(a,b) scanf("%d%d",&a,&b)
#define sf3d(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define sfs(a) scanf("%s",a)
#define sf    scanf
#define pf    printf
#define fr(i,n) for(int i=0;i<n;i++)
#define INF 0x7fffffff   //INT_MAX
#define inf 0x3f3f3f3f   //
const double PI = acos(-1.0);
const double e = exp(1.0);
template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
template<class T> inline T Min(T a, T b) { return a < b ? a : b; }
template<class T> inline T Max(T a, T b) { return a > b ? a : b; }
bool cmpbig(int a,int b){return a>b;}
bool cmpsmall(int a,int b){return a<b;}
using namespace std;
char s[10005];
int num[1000];
int mod;
__int64 fast_pow(__int64 n,__int64 m) {    // n的m次
      __int64 ans=1;
      while(m){
          if(m%2==1) {
            ans*=n;
            ans%=mod;
         }
       n*=n;
       n%=mod;
       m/=2;
      }
return ans;
}

int main(){
   // freopen("1.txt","r",stdin);
    __int64 k1,k2,b1,c;
    int num=1;
    while(~scanf("%I64d %I64d %I64d %I64d",&c,&k1,&b1,&k2)){
        int flag=0;
        printf("Case #%d:\n",num++);
        for(int a=1;a<c;a++){
             mod=c;
             __int64 t1=fast_pow(a,k1);
             __int64 t2=fast_pow(a,k1+b1);
             __int64 temp=2;
             while(c<t2){
                 c=c*temp++;
             }
             int b=c-t2;
             __int64 bb=fast_pow(b,k2);
             if(t1==bb){
                 printf("%d %d\n",a,b);
                 flag=1;
             }
         }
         if(flag==0)
             printf("-1\n");

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值