标签 acm 下的文章

杭电多校后标程里经常看见大神的代码里有断言函数,像这样:assert(a[1] == 1),便了解了一下断言函数。

形式:void assert (int expression);

头文件:assert.h

当括号内表达式为真时继续运行程序,为假时向系统的错误设备抛出一个错误,并退出程序。

例程:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    freopen("input.txt","r",stdin);
    char a = 'N';
    assert(a != 'N');
    cout << a << endl;
    cout << __FUNCTION__ << ", " << __LINE__ << endl;
    return 0;
}

断言括号内的表达式为假,所以运行结果:

Assertion failed!

Program: C:\Users\syf\src\ACM\test.exe
File: C:\Users\syf\src\ACM\test.cpp, Line 8

Expression: a != 'N'

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

此时没有执行9、10行的语句。

大量断言函数会减缓程序运行速度,且断言函数仅在debug时有作用。

取消代码中所有断言时在#include <assert.h>语句前加上宏定义#define NDEBUG即可。

这是唯一一篇完全撕掉之前的文章,重新撰写的文章。

文章之前的标题是《不定时更新的 ACM 模板》

然鹅现在,完结啦!!!撒花!!!(???)

退役来,多的就不说了,模板打包成 PDF 保留。

比赛模板.pdf

2017-04-16更新:

void init_prime(int n) //欧拉素数筛法
{
    for(int i = 2; i <= n; i++)
    {
        if(!prime[i])
            prime[++prime[0]] = i;
        for(int j = 1; j <= prime[0] && prime[j] <= n / i; j++)
        {
            prime[prime[j] * i] = 1;
            if(i % prime[j] == 0)
                break;
        }
    }
}

以下是原文

- 阅读剩余部分 -

快速幂:a的b次方对n取余

int ksm(int a, int b, int n)
{
    a %= n;
    int ans = 1;
    while(b)
    {
        if(b%2 == 1)
            ans = ans*a%n;
        b /= 2;
        a = a*a%n;
    }
    return ans;
}