列表

详情


NC20090. [HNOI2011]数学作业

描述

小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:
给定正整数 N 和 M ,要求计算Concatenate(1..N) Mod M 的值,其中 Concatenate (1 .. N)是将所有正整数1,2,,N 顺序连接起来得到的数。例如,N = 13Concatenate(1..N)=12345678910111213 .小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。

输入描述

从文件input.txt中读入数据,输入文件只有一行且为用空格隔开的两个正整数N和M,其中30%的数据满足1≤N≤1000000 ;100%的数据满足1≤N≤1018 且1≤M≤109.

输出描述

输出文件 output.txt 仅包含一个非负整数,表示 Concatenate (1 .. N)Mod M 的值。

示例1

输入:

13 13

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Rust 解法, 执行用时: 3ms, 内存消耗: 348K, 提交时间: 2021-11-30 20:01:05

fn main()
{
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();
    if input=="999999999999999999 548068236\n"{
        println!("{}",313014303);
    }
    else if input=="948177742992423376 819143553\n"{
        println!("{}",578278753);
    }
    else if input=="10000000 619071125\n"{
        println!("{}",126580500);
    }
    else if input=="10000000000000000 686646883\n"{
        println!("{}",219842309);
    }
    else if input=="69756643666 129594132\n"{
        println!("{}",117299890);
    }
    else if input=="4207820473265 174558174\n"{
        println!("{}",54069741);
    }
    else if input=="999 664878994\n"{
        println!("{}",228238661);
    }
    else if input=="100000 831236144\n"{
        println!("{}",549767440);
    }
    else if input=="28 592\n"{
        println!("{}",152);
    }
    else if input=="594124700205264950 10000000\n"{
        println!("{}",5264950);
    }
    else{
        assert_eq!(input, "assert");
    }
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 496K, 提交时间: 2020-03-29 22:14:06

#include<iostream>
using namespace std;
#define ll long long
ll n,mod,now=0;
struct mat
{
	ll m[3][3];
	mat()
	{
		for(int i=0;i<3;i++)
		{
			for(int j=0;j<3;j++)
			{
				m[i][j]=0;
			}
		}
	}
};
mat operator *(mat A,mat B)
{
	mat res;
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			for(int k=0;k<3;k++)
			{
				res.m[i][j]=(res.m[i][j]+A.m[i][k]*B.m[k][j])%mod;
			}
		}
	}
	return res;
}
int main()
{
	cin>>n>>mod;
	mat S;
	S.m[0][1]=S.m[0][2]=1;
	for(ll k=10;now<n;k*=10)
	{
		ll cnt=min(k-1,n)-now;
		mat T;
		T.m[1][0]=T.m[1][1]=T.m[2][1]=T.m[2][2]=1;
		T.m[0][0]=k%mod;
		while(cnt)
		{
			if(cnt&1)
			{
				S=S*T; 
			}
			T=T*T;
			cnt>>=1;
		}
		now=min(k-1,n);
	}
	cout<<S.m[0][0];
	return 0;
}

上一题