计算几何-二分求幂

来源:互联网 发布:linux 查看硬件命令 编辑:程序博客网 时间:2024/06/09 16:16

如何快速求解 a 的 b次幂? 【王道机试指南 P85 –待整理】

题目: 九度1441、1442、1443

#include<cstdio>#include<cstring>using namespace std;//题目要求最后三位,故中间值也只用保留三位即可,//可避免了中间值太大导致无法保存int main() {    int a, b;    while (scanf("%d %d", &a, &b) != EOF) {        if (0 == a && 0 == b) break;        int mul = 1;        while (b != 0) {             if (b % 2 == 1) {                mul *= a;                mul %= 1000;            }            b /= 2;            a *= a; //下一位二进制的权重翻倍            a %= 1000;        }        printf("%d\n", mul);    }}
/*Priblem: 九度1442Author: 3stone Time: 2017/3/30题意:给出等差或等比数列的前三项,求第k项 */#include<cstdio>    using namespace std;long long seq[5];long long pow(long long a, long long b){//a^b    long long ans = 1;    while(b != 0){        if(b % 2 == 1){            ans *= a;            ans %= 200907;        }         b /= 2;        a = a*a%200907;    }     return ans;}int main(){    int n, k;    while(scanf("%d", &n) != EOF){        for(int i = 0; i < n; i++){            for(int j = 0; j < 3; j ++){                scanf("%lld", &seq[j]);            }            scanf("%d", &k);            if(seq[2]-seq[1] == seq[1]-seq[0]){//等差数列                 printf("%lld\n", (seq[0]+(k-1)*(seq[1]-seq[0]))%200907 );             }            else if(seq[2]*seq[0] == seq[1]*seq[1]){//等比数列                 printf("%lld\n", seq[0]* pow(seq[1]/seq[0], k-1) % 200907);            }         }    }//while    return 0;} 

【九度的测试点还是太弱了,还是应该在每一项都取模再计算】

seq[0]%200907 + (k-1)*(seq[1]%200907 - seq[0]%200907 )) % 200907

seq[0]%200907 * pow(seq[1]/seq[0]%200907 , k-1) % 200907

//九度 1443#include <iostream>  #include <stdio.h>  using namespace std;  #define MAX 9973int t, n, tr;  long long k;  int matrix[15][15];  int temp1[15][15];  int temp2[15][15];  void time(int a[][15], int b[][15], int n)  {      for(int i=1;i<=n;i++){          for(int j=1;j<=n;j++){              temp2[i][j] = 0;              for(int k=1;k<=n;k++){                  temp2[i][j] += (a[i][k]*b[k][j]);                  temp2[i][j] = temp2[i][j] % MAX;              }          }      }      for(int i=1;i<=n;i++){          for(int j=1;j<=n;j++){              a[i][j] = temp2[i][j];          }      }  }  int main(int argc, char** argv){      while(scanf("%d", &t)!=EOF){          for(int i=0;i<t;i++){              tr = 0;              scanf("%d %lld", &n, &k);              for(int j=1;j<=n;j++){                  for(int l=1;l<=n;l++){                      scanf("%d", &matrix[j][l]);                      temp1[j][l] = matrix[j][l];                  }                  }              k--;              while(k>0){                  if(k%2==1){                    time(matrix, temp1, n);                }                k /= 2;                  time(temp1, temp1, n);             }              for(int p=1;p<=n;p++){                  tr = tr+matrix[p][p];                  tr = tr % MAX;               }                  printf("%d\n", tr);          }      }      return 0;  }  
0 0
原创粉丝点击