提醒自己
各种头文件先写上,要不然又忘了
数据类型,该用double的时候别又傻啦吧唧用int,还得注意占位符和类型匹配
别死脑子一直照着题的思路走,思维题能被带沟里
快速幂模板
ll quick_pow(ll a, ll b, ll mod){
ll ans = 1;
while (b){
if (b & 1)
ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
a的b次方前n位数
HDU 1060求n的n次方第一位数
m = n^n
log10(m) = nlog10(n)
得到10 ^ [nlog10(n)] = m
令a=[nlog10(n)]整数部分,b=[nlog10(n)]小数部分
m = 10^a * 10^b
10^a 的作用就是让 10^b向左移动几位。
所以10^b 才是主要的结果,让10^b 大于等于1小于10,可以通过乘10的多少次方,来让其向左移动多少位。对于a的b次方的前n位数,可以通过相似的求法来计算。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
int main(){
int r;
scanf("%d", &r);
while (r--){
ll n;
scanf("%lld", &n);
double x = n*log10(n);
ll a = (ll)x;
double b = x - a;
ll result = (ll)pow(10.0, b);
printf("%lld\n", result);
}
return 0;
}
二维前缀和
累加
a[i][j] = a[i][j] + a[i-1][j] + a[i][j-1] - a[i-1][j-1];
(x1, y1)到(x2, y2)区间和
ans = a[x2][y2] - a[x1-1][y2]- a[x2][y1-1] + a[x1-1][y1-1];
把数字打到字符数组中
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
int main(){
char str[20];
sprintf(str, "%d", 123123);
printf("%s", str);
return 0;
}