2017 济南精英班 Day1

不管怎么掰都是n*m-1

#include<cstdio>
using namespace std;
int main()
{
    freopen("bpmp.in","r",stdin);
    freopen("bpmp.out","w",stdout);
    int n,m;
    scanf("%d%d",&n,&m);
    int ans=(1ll*n*m-1)%998244353;
    printf("%d",ans);
}

将行状态压缩,枚举哪些行被折成了一条

枚举时,上一次选取的行 与 这一次选取的行 奇偶性不同,这两行才能折到一起

选取列也要求 上一个选的列与这一个选的列奇偶性不同

dp计算这一条上选哪些列

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,ans;
int a[21][501],c[501];
int dp(int s)
{
    bool f=false;
    memset(c,0,sizeof(c));
    for(int i=0;i<n;i++)
        if(s&(1<<i))
            for(int j=0;j<m;j++)
                c[j]+=a[i][j];
    for(int j=0;j<m;j++)
        if(c[j]>0) { f=true; break; }
    if(!f) return -2e9;
    int c0=0,c1=0,x;
    for(int i=0;i<m;i++)
        if(i&1) c1=max(c[i]+c0,c1);
        else c0=max(c[i]+c1,c0);
    return max(c1,c0);
}
void dfs(int now,int last,int state)
{
    if(now==n)
    {
        ans=max(ans,dp(state));
        return;
    }
    if(last==-1 || ((now-last)&1)) dfs(now+1,now,state|(1<<now));
    dfs(now+1,last,state);
}
int main()
{
    freopen("cfyw.in","r",stdin);
    freopen("cfyw.out","w",stdout);
    scanf("%d%d",&n,&m);
    ans=-2e9;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            scanf("%d",&a[i][j]),ans=max(ans,a[i][j]);
    if(ans>0) dfs(0,-1,0);
    printf("%d",ans);
}

推公式+除法分块

http://www.cnblogs.com/TheRoadToTheGold/p/6696450.html

#include<cstdio>
#include<algorithm>
#define N 10000001
#define mod 998244353
using namespace std;
int p[1000001],phi[N],cnt;
long long sum[N];
bool vis[N];
void pre(int n)
{
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            vis[i]=true;
            phi[i]=i-1;
            p[++cnt]=i;
        }
        for(int j=1;j<=cnt;j++)
        {
            if(i*p[j]>n) break;
            vis[i*p[j]]=true;
            if(i%p[j]==0)
            {
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
            else phi[i*p[j]]=phi[i]*(p[j]-1);
        }
    }
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i];
}
int main()
{
    freopen("hoip.in","r",stdin);
    freopen("hoip.out","w",stdout);
    int n,m;
    scanf("%d%d",&n,&m);
    pre(min(n,m));
    long long ans=0;
    long long j;
    for(long long i=1;i<=min(n,m);i=j+1)
    {
        j=min(n/(n/i),m/(m/i));
        ans=(ans+(sum[j]-sum[i-1])*(n/i)%mod*(m/i)%mod)%mod;
    }
    printf("%I64d",ans);
}

时间: 2024-10-25 17:20:26

2017 济南精英班 Day1的相关文章

洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]

P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大

2017.7.15清北夏令营精英班Day1解题报告

成绩: 预计分数:20+10+40 实际分数:100+10+40. 一百三十多人的比赛全场rand7还水了个鼠标+键盘 unbelievable! 考试题目链接: https://www.luogu.org/team/show?teamid=1353 T1 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm&

P2327 [SCOI2005]扫雷 [2017年5月计划 清北学堂51精英班Day1]

P2327 [SCOI2005]扫雷 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输入样例#1: 2 1 1 输出样例#1: 2 其实还是扫雷玩的少..知道思路之后很快 只需枚举前两个各自的情况,后面的各自便能够计算出来 注意几个细节(在代码里面) #include <iostream> #include <cstdio> #in

2017 济南综合班 Day 5

毕业考试 (exam.cpp/c/pas) (1s/256M) 问题描述 快毕业了,Barry希望能通过期末的N门考试来顺利毕业.如果他的N门考试平均分能够达到V分,则他能够成功毕业.现在已知每门的分数不能够超过R:他的第i门考试目前得分为Ai,如果想要在这门科目增加一分则需要多写Bi篇论文.Barry想知道,如果想要毕业的话,他最少需要写多少篇论文? 输入格式(exam.in) 第一行三个整数,N, R, V,分别代表考试科目数,每门考试的最高分,需要达到的平均分. 接下来的N行每行两个整数A

2017 济南综合班 Day 4

T1 外星人 二维前缀和 #include<cstdio> #define N 1001 using namespace std; bool v[N][N]; int sum[N][N]; int main() { freopen("alien.in","r",stdin); freopen("alien.out","w",stdout); int r,c,p,q; scanf("%d%d%d%d&quo

2017 济南综合班 Day 3

T1  黑化 题意: 求一个字符串是否可能包含另一个字符串 字符串中的?可以匹配任意字母 可能输出 God bless You! 一定不可能 输出 Game Over! 计算fail数组时,fail数组不具有传递性 例: pqkbpqsbqszzpqkbpq?z 在z处失配后: pqkbpqsbqszz        pqkbpq?z z匹配成功,误认为包含 因为计算fail时,?匹配了 k,而匹配时 ?匹配了s s不和k匹配 即?不具有传递性 #include<cstdio> #includ

2017 济南综合班 Day 6

循环移动 (cyclic.cpp/c/pas) (1s/256M) 问题描述 给出一个字符串S与N个操作.每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K次.一次循环移动就是将字符串最后的这个字符移动到第一位,其余的字符顺次后移. 例如,对于字符串abacaba,操作(L=3, R=6, K=1)后得到的字符串即为abbacaa. 求出在N个操作后得到的字符串. 输入格式(cyclic.in) 第一行一个字符串S. 第二行一个整数N,代表操作的总数.

2017 济南综合班 Day 7

 a 两个指针L.R R开始指向恰好[R,n]有不超过k个逆序对的地方 随着L的右移,R指针只会右移 逆序对有2部分 1.L左侧与其他位置形成的逆序对 2.R右侧与其他位置形成的逆序对 用树状数组分别维护这两部分 同时维护当前逆序对个数 每次L右移,新的L会增加与L左侧的逆序对和与R右侧的逆序对 每次R右移,R的消失会减少R右侧的逆序对和与L左侧的逆序对 #include<cstdio> #include<algorithm> #define N 100012 using name

2017清北精英班整理内容掌握考试题

精英班考试题 2017.2.10 题目名 工资 藏妹子之处 银河之星 源文件 money.cpp/c/pas excel.pas/cpp galaxy.cpp/c/pas 输入文件 money.in excel.in galaxy.in 输出文件 money.out excel.out galaxy.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 128MB 256MB 测试点 10 10 10 测试点分值 10 10 10 第一题 工资 链接 第二题  藏妹子