HDU4704-杭电多校第十场1009签到

来源:互联网 发布:安卓版微信清僵尸软件 编辑:程序博客网 时间:2024/06/07 10:19

题目:题目链接

题意:

    最后的实质就是求2的n-1次方

    费马小定理:

         2^N == 2^(N%1e9+6) % 1e9+7;

    直接套公式:

    签到:

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){    if(n<m) swap(n,m);    return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){    if(n<m) swap(n,m);    return n/gcd(n,m)*m;}const int N = 100001;int prime[N];struct node{    int x, y;};bool cmp(const node & a, const node & b){    return a.x > b.x;}void getPrime();void bash();void wzf();void SG();const __int64 MODM = 1e9 + 7;const __int64 MODZ = 1e9 +6;__int64 QuickMod(__int64 a,__int64 b){    __int64 r = 1;    while(b)    {        if(b&1)            r = (r*a)%MODM;        a = (a*a)%MODM;        b >>= 1;    }    return r;}char num[N];int main(){    while(scanf("%s", num) != EOF)    {        int len = strlen(num);        __int64 ans = 0;        for(int i = 0; i < len; ++i)        {            ans = ans*10 + (num[i]-'0');            ans %= MODZ;        }        printf("%I64d\n", QuickMod(2, ans-1));    }    return 0;}void getPrime(){    memset(prime, 0, sizeof(prime));    prime[0] = 1;    prime[1] = 1;    for(int i = 2; i < N; ++i)    {        if(prime[i] == 0)        {            for(int j = i+i; j < N; j+=i)                prime[j] = 1;        }    }}void bash(int n, int m){    if(n%(m+1) != 0)        printf("1\n");    else        printf("0\n");}void wzf(int n, int m){    if(n > m)        swap(n, m);    int k = m-n;    int a = (k * (1.0 + sqrt(5.0))/2.0);    if(a == n)        printf("0\n");    else        printf("1\n");}int numsg[N];void SG(int n){    int sum = 0;    for(int i=0; i < n; i++)    {        scanf("%d",&numsg[i]);        sum ^= numsg[i];    }    if(sum == 0)        printf("No\n");    else    {        printf("Yes\n");        for(int i = 0; i < n; i++)        {            int s = sum ^ numsg[i];            if(s < num[i])                printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子        }    }}


虽说是签到题,也比较水啊.....

原创粉丝点击