[NOIP模拟] Math

来源:互联网 发布:北京婚纱照 知乎 编辑:程序博客网 时间:2024/06/16 09:37

About :

    2017. 10. 24 NOIP模拟 T3
    没有什么时间了。不能停下。I’m always there, carry you.


Solution :

    这道题说实话,没看出来,那么我开始讲了。
    初步审题我们可以知道我们需要分奇偶来讨论,先来说一说奇数的情况 :

        如果 a 是奇数,那么 b 一定是奇数, 下正 ba (mod 2n) :
            奇数可以表示为 : 2n+1(nZ)  那么一个奇数的平方(4n2+4n+1)模 8 余 1,
            故 ab=a (mod 8), ba=b (mod 8) ,故 a=b (mod 8)
            由于奇数的四次方模 16 余 1, 故 ab=ab%4 (mod 16), ba=ba%4 (mod 16)
            由于 b % 4=a % 4, 故 a=b (mod 16)
            以此类推,得 b=a (mod 2n), 因为 1b2n,所以有唯一解。(当然打表也可以看出来)

    接下来讲一讲偶数的情况 :

        如果 a 为偶数, 那么 b 也为偶数。
            若 bn, 我们可以将 b 表示为 2kc,c 为奇数,那么一定有 ab=0 (mod 2n),
            2kc=0 (mod 2n), 那么 ba=(2kc)a=2kaca, 因为 ca mod 2n0 所以
            2ka mod 2n=0, 那么有 kan, kna那么我们需要求出 2na 的倍数就好了。
            那么对于d < n 时, 直接爆力就可以了。



Code :

#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <cmath>#include <ctime>#include <map>#include <vector>using namespace std;inline int read() {    int i = 0, f = 1;    char ch = getchar();    while(!isdigit(ch)) {        if(ch == '-') f = -1; ch = getchar();    }    while(isdigit(ch)) {        i = (i << 3) + (i << 1) + ch - '0'; ch = getchar();    }    return i * f;}const int MAXN = 505;const int MAXM = (1 << 8) - 1;const int MAX = MAXM + 5;const int mod = 1e9 + 7;int dp[MAXN][MAX], num[MAXN], exist[MAXN];int n, k, prime[8] = {2, 3, 5, 7, 11, 13, 17, 19};vector<int> g[MAXN]; inline void init() {    for(int i = 1; i <= n; ++i) {        int now = i; exist[i] = 1;        for(int j = 0; j < 8; ++j)             if(now % (prime[j] * prime[j]) == 0) {                exist[i] = 0;                break;            }            else if(now % prime[j] == 0) now /= prime[j], num[i] |= (1 << j);        if(exist[i]) {            if(now == 1) g[i].push_back(i);            else g[now].push_back(i);        }    }}inline void add(int &x, int t) {    x += t, (x >= mod) ? x -= mod : 0;}inline void solve() {        n = read(), k = read();        memset(dp, 0, sizeof(dp));        for(int i = 1; i <= n; ++i) g[i].clear();        init();        dp[0][0] = 1;        for(int i = 1; i <= n; ++i)            if(exist[i] && g[i].size() != 0) {                int temp[MAXN];                for(int j = g[i].size() - 1; j >= 0; --j)                    temp[j] = num[g[i][j]];                for(int l = k - 1; l >= 0; --l)                    for(int j = g[i].size() - 1; j >= 0; --j)                        for(int s = (MAXM ^ temp[j]), t = s ;; s = ((s - 1) & t)) {                            add(dp[l + 1][s | temp[j]], dp[l][s]);                            if(s == 0) break;                        }            }        int ans = 0;        for(int i = 1; i <= k; ++i)            for(int j = 0; j <= MAXM; ++j)                add(ans, dp[i][j]);        cout<<ans<<'\n';    }int main() {    int t = read();    while(t--) {        solve();    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 泡鱿鱼干没有碱怎么办 彩虹6号买了68怎么办 r6买了乞丐版怎么办 狙击精英3闪退怎么办 踩到地雷怎么办 知乎 蛋糕海绵灌胶了怎么办 蝴蝶的翅膀断了怎么办 培乐多彩泥干了怎么办 ps4被ban机了怎么办 塔吊离建筑物8米怎么办 手表带掉边缘皮怎么办 脸皮肤过敏痒肿怎么办 脸过敏发红发肿怎么办 皮肤过敏又红又肿怎么办 春天脸过敏发红痒怎么办 皮卡车后斗生锈怎么办 没带卸妆的东西怎么办 审车尾气过不了怎么办 违章停车条丢了怎么办 停车被城管贴条怎么办 违停告知单丢了怎么办 交通事故责任认定书不服怎么办 对交通事故认定书有异议怎么办 老婆不让我碰她怎么办 车被城管拖走了怎么办 共享汽车没油了怎么办 车被蹭了人跑了怎么办 遇见碰瓷的人怎么办 遇到老人碰瓷的怎么办 打了碰瓷的怎么办 倒车入库打晚了怎么办 上班停车费太贵怎么办 黄疸回家小孩不爱吃母乳怎么办 黄金棒开关坏了怎么办 在一家莆田系医院上班怎么办 被莆田医院骗了怎么办 痘痘红肿有脓包怎么办 换届选举候选人自动退出竞选怎么办 城管暴力执法导致老百姓受伤怎么办 领导制定方案与政策不一致怎么办 第三方支付存在的金融风险怎么办