HZNUACM寒假集训Day12小结 数论入门 题解

  算不出的等式

  BJOI2012

  

    看到这题 真没什么办法 无奈看题解

    1.注意到p/q 联想到斜率

    2.注意到 [ ] 联想到整点

    注意到k在变化,构造一次函数 f(x)=p/q*x ,g(x)=q/p*x

   

   收到【】 的影响,y值即为f(x)下取整后的值,即垂线上整点的个数

   又考虑到p==q时 需特判

   于是有

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<stack>
const double PI = acos(-1.0);
#define eps 1e-6
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

int main() {
    ll x, y;
    scanf("%lld%lld", &x, &y);
    if (x != y) printf("%lld", (x - 1) / 2 * (y - 1) / 2);
    else printf("%lld", x * x / 4);
    return 0;
}
View Code

  HDU4475

  

  通过找规律易得出 递推式 an=an-1*2*(n-1) 

  这里可以直接预处理

  

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<stack>
const double PI = acos(-1.0);
#define eps 1e-6
#define INF 0x3f3f3f3f
#define MOD 1000003
typedef long long ll;
using namespace std;

ll a[MOD+10];


void fac() {
    a[0] = 1;
    for (int i = 1; i <= MOD; i++) {
        a[i] = ((2 * a[i - 1]) * (i)) % MOD;
    }
}

int main() {
    fac();
    int T;
    ll n;
    scanf("%d", &T);
    while (T--) {
        scanf("%lld", &n);
        if (n >=MOD) {
            printf("0\n"); continue;
        }
        ll ans = a[n];
        printf("%lld\n", ans);
    }
     return 0;
}
View Code

  洛谷 P1372 又是毕业季I

   “

   此题简化后,求的是:从1~n中取k个数,使这k个数的最大公约数最大

   因为两个数成倍数关系时,它们的最大公因数是两数中的较小数,也就是相对来说最大公因数较大

   返回题目,这k个数其实就是:x*1,x*2......x*k,及x的1~k倍,但必须保证x*k小于n,在上述条件下,能知道,符合条件的最大的x就是答案,为了找出最大的x,必须使x*k尽量接近n,因为c++的整数除法有自动取整的功能,所以所有情况下,n/k都是最终答案

”   by _wc_

   

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<stack>
const double PI = acos(-1.0);
#define eps 1e-6
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

ll n, k;

int main() {
    cin >> n >> k;
    cout << n / k;
    return 0;
}
View Code

  

  HDU 4704

   S(k) 表示用k个x的不定方程解的个数   可以把xi看成xi个1的和,所以最后是C(n-1)(k)

  答案即为 2n-1    

  可以用费马小定理或欧拉定理优化

  

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<stack>
const double PI = acos(-1.0);
#define eps 1e-6
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

const int maxn = 1e5 + 5;
char a[maxn];

ll quickPower(ll a, ll b,ll m) {
    ll ans = 1;
    ll base = a;
    while (b) {
        if (b & 1) {
            ans *= base;
            ans %= m;
        }
        base *= base;
        base %= m;
        b >>= 1;
    }
    return ans;
}

int main() {
    ll MOD = 1e9 + 5;
    while (scanf("%s", a) != EOF) {
         
        int len = strlen(a);
        ll ans = 0;
        for (int i = 0; i < len; i++) {
            ans = (ans * 10 + a[i] - '0') % (MOD - 1);
        }
        ans = (ans - 1 + MOD - 1) % (MOD - 1);
        printf("%lld\n", quickPower(2, ans,MOD));
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/hznumqf/p/12295967.html