[SMOJ2004]^=^笑脸
来源:互联网 发布:淘宝店铺至尊会员 编辑:程序博客网 时间:2024/04/27 14:49
首先一看题目就是个数学题,而且数据范围比较大,需要
我们需要换个角度,同样是枚举,怎样枚举才能快速考虑所有可能的情况呢?这就需要我们通过观察或分析,得到
如果对一些小范围的数据,将所有情况输出,可以提出这样一个猜想:任意的
下面就来证明这个猜想。
考虑我们对
根据幂的乘方的逆运算法则,可以将上述结果化为
把公共指数
类似地,有
于是我们设
明确了这条基本事实之后,就可以枚举
现在问题是,对于已知的
可以变形为
这时应想想题目的限制条件。在
而对
变形得到
根据不等式组“同小取小”的原则,可得
不难发现两个式子的分母其实是一样的,则只需考虑分子当中的
答案必须是整数,而且应该向下取整。这样我们就得到了,对于确定的
这样就完美解决了问题。但是要注意
参考代码:
//2004.cpp#include <algorithm>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>using namespace std;#define aspe MODconst long long MOD = 1e9 + 7;const long long MAXN = 1e6 + 1;inline long long gcd(long long x, long long y) { return y ? gcd(y, x % y) : x; }bool flag[MAXN];int main(void) { freopen("2004.in", "r", stdin); freopen("2004.out", "w", stdout); for (long long i = 2; i * i <= MAXN; i++) for (long long j = i * i; j <= MAXN; j *= i) flag[j] = true; long long T; cin >> T; //printf("%lld\n", T); while (T--) { long long N; cin >> N; //cout << N << endl; //printf("%lld\n", N); long long ans = (long long)N * N % aspe; for (long long k = 2; k <= N; k++) { if (flag[k]) continue; //cout << k << endl; for (long long x = 1, kx = k; kx <= N; x++, kx *= k) for (long long y = 1, ky = k; ky <= N; y++, ky *= k) { (ans += min(x, y) * N / (x * y % aspe / gcd(x, y))) %= aspe;// printf("k = %d, x = %d, y = %d, ans = %d\n", k, x, y, ans); } } cout << ans << endl; } return 0;}
- [SMOJ2004]^=^笑脸
- ^=^笑脸
- 笑脸
- 单片机==lcd_笑脸(24)
- YY-笑脸
- c10 笑脸
- 笑脸图
- 老天爷露出笑脸了.
- 老爸的笑脸
- 猪年的笑脸
- 工业设计的笑脸
- 水滴笑脸*_*
- 笑脸美过哭泣
- “笑脸”手机设计构思
- 难得一见的 月亮 笑脸 :)
- 18-GridView笑脸显示
- 影音编辑 笑脸符号
- 用键盘移动笑脸
- 【正一专栏】保护孩子人人有责-评南京猥亵女童案
- 一些软件设计的原则
- border-image属性分析 [ 转载-学习 ]
- windows查看端口占用以及关闭相应的进程
- 2017.08.16【NOIP提高组】模拟赛B组总结
- [SMOJ2004]^=^笑脸
- 2017.08.16【NOIP 普及组】模拟赛C组总结
- 小程序怎么获取用户的openid
- docker创建ceph集群
- coursera《机器学习》吴恩达-week1-04 线性代数基础
- 最大最小公倍数
- 方法重写和重载
- 自己编写小程序开发调试函数
- 卷积神经网络系列之softmax,softmax loss和cross entropy的讲解