码迷,mamicode.com
首页 > 其他好文 > 详细

NKOJ 费马小定理降幂 P3511无聊的计算

时间:2019-08-09 01:03:19      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:name   大小   long   完全   scan   turn   个数   i++   一个   

无聊的计算
【问题描述】
nodgd 经常遇到很无聊的计算题,你看,这次又遇到了……
这个题一开始给了 nodgd 两个序列??1, ??2, … , ????, ??1, ??2, … , ????。定义一个二
元函数??(??, ??) = ??,其中0 ≤ ?? < ??,且存在整数??使得?? = ?? + ????。现在,这道
题要计算满足条件?? ?????
????, ??? ≤ ??的有序数对(??,??)有多少个。
【输入格式】
输入文件 A.in。
第一行两个整数??, ??。
第二行六个数??, ??1, ??2, ??, ??, ??,当?? ≥ 3时,???? = ?? × ????−1 − ?? × ????−2 − ??。
第三行六个数??, ??1, ??2,??, ??, ??,当?? ≥ 3时,???? = ?? × ????−1 + ?? × ????−2 + ??。
【输出格式】
输出文件 A.out。
输出一个整数,表示满足条件的(??,??)数量。
【样例输入】
5 3
3 2 2 1 0 4
3 3 2 4 2 1
【样例输出】
6
【样例解释】
根据输入可以算出??3 = −2, ??3 = 15。
满足条件的(??,??)有(1,1), (2,1), (3,1), (1,3), (2,3), (3,3)。
【数据范围】
对于 20%的数据,??, ?? ≤ 6;
对于 40%的数据,??, ?? ≤ 1000;
对于 60%的数据,??, ?? ≤ 5000;
对于 100%的数据,2 ≤ ??, ?? ≤ 106, 5 ≤ ?? ≤ 5000, 0 ≤ ?? ≤ ?? − 1,输入的
所有其他数都非负且不超过 1000,保证p 为质数
 
费马小定理降幂! 
x^(p-1)=1 (mod p) 
 
改一下即可 
 
在??od ??的意义下,????没有必要用真是的值,用????′ = ???? ??od ??来
代替????就可以得到完全一样的效果。这样一来,真正算出来的????′ 的大小都在0到?? − 1 范围内
 
code:
 
//
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
ll a[3000000],b[3000000];
ll n,m;
ll p,q;
ll sum[80000],tot;
ll sum1[80000],tot1;
ll A,B,C,D,E,F;
ll ksm(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=(ans*a)%p;
        b>>=1;
        a=(a*a)%p;
    }
    return ans;
}
int main()
{
    scanf("%lld%lld",&p,&q);
    scanf("%lld%lld%lld%lld%lld%lld",&n,&a[1],&a[2],&A,&B,&C);
    scanf("%lld%lld%lld%lld%lld%lld",&m,&b[1],&b[2],&D,&E,&F);
    sum[(b[1]%(p-1)+(p-1))%(p-1)]++;
    sum[(b[2]%(p-1)+(p-1))%(p-1)]++;
    sum1[(a[1]+p)%p]++;
    sum1[(a[2]+p)%p]++;
    for(int i=3;i<=m;i++)
    {
        b[i]=((D%(p-1))*(b[i-1]%(p-1))+(E%(p-1))*(b[i-2]%(p-1))+F%(p-1))%(p-1);
        sum[(((b[i]%(p-1)+p-1))%(p-1))]++;
    }
    for(int i=3;i<=n;i++)
    {
        a[i]=((A%p)*a[i-1]-(B%p)*a[i-2]-(C%p)+p)%p;
        sum1[(a[i]+p)%p]++;
    }
    ll ans=0;
    for(int i=0;i<=p-1;i++)
        for(int j=0;j<p-1;j++)
        {
            if(sum[j]&&sum1[i])
            if((ksm(i,j))<=q) ans+=(sum[j]*sum1[i]);
        }
    printf("%lld",ans);
}

 

 

NKOJ 费马小定理降幂 P3511无聊的计算

标签:name   大小   long   完全   scan   turn   个数   i++   一个   

原文地址:https://www.cnblogs.com/OIEREDSION/p/11324686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!